08淺拷貝和深拷貝

2021-09-07 22:34:34 字數 3404 閱讀 7735

有時候,從資料庫讀取資料填充物件或從硬碟讀取檔案填充物件,這樣相對耗時。這時候想到了物件的拷貝。

淺拷貝□ 什麼是"淺拷貝"

當針對乙個物件前拷貝的時候,對於物件的值型別成員,會複製其本身,對於物件的引用型別成員,僅僅複製物件引用,這個引用指向託管堆上的物件例項。

□ 有乙個物件,包含引用型別的類成員和值型別的struct成員

cinema包含引用型別成員room和值型別成員film。

public

class room

}
public

struct film

}
public

class cinema

public

object clone()

}
□ 測試拷貝後的效果

1、列印出原先物件拷貝前值型別和引用型別成員的值

2、對原先物件拷貝,列印出複製物件值型別和引用型別成員的值

3、改變原先物件的值,再次列印原先物件的值型別和引用型別成員的值

4、再次列印複製物件值型別和引用型別成員的值

static

void main(string args)

,引用型別成員的字段值為", cinema1._film._name,cinema1._room._maxseat);
console.writeline("拷貝之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
//修改拷貝之前引用型別的字段值
cinema1._film._name = "極品飛車";
cinema1._room._maxseat = 80;
console.writeline("修改之後,結構成員的字段值為,引用型別成員的字段值為", cinema1._film._name, cinema1._room._maxseat);
console.writeline("修改之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
console.readkey();
}
結果:

分析:淺拷貝關鍵點是對引用型別拷貝的是物件引用,這個引用指向託管堆上的物件例項。改變原對應引用型別的值,會影響到複製物件。

深拷貝□ 什麼是"深拷貝"

對引用成員指向的物件也進行複製,在託管堆上賦值原先物件例項所包含的資料,再在託管堆上建立新的物件例項。

□ 通過對每個物件成員進行複製進行深拷貝

public

object clone()

□ 也可以通過序列化和反序列化進行深拷貝

public

object clone1()

□ 測試,採用序列化和反序列化深拷貝,但必須把所有的類打上[serializable]

[serializable]
public

class room

public room(int maxseat)
}
[serializable]
public

struct film

}
[serializable]
public

class cinema

//淺拷貝
//public object clone()
//
//深拷貝 對每個物件成員進行複製
public

object clone()

//使用序列化和反序列化進行複製
public

object clone1()

}
□ 測試拷貝後的效果

1、列印出原先物件拷貝前值型別和引用型別成員的值

2、對原先物件拷貝,列印出複製物件值型別和引用型別成員的值

3、改變原先物件的值,再次列印原先物件的值型別和引用型別成員的值

4、再次列印複製物件值型別和引用型別成員的值

static

void main(string args)

,引用型別成員的字段值為", cinema1._film._name,cinema1._room._maxseat);
console.writeline("拷貝之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
//修改拷貝之前引用型別的字段值
cinema1._film._name = "極品飛車";
cinema1._room._maxseat = 80;
console.writeline("修改之後,結構成員的字段值為,引用型別成員的字段值為", cinema1._film._name, cinema1._room._maxseat);
console.writeline("修改之後,新的結構成員的字段值為,引用型別成員的字段值為", cinema2._film._name, cinema2._room._maxseat);
console.readkey();
}
結果:

分析:深拷貝後,兩個物件的引用成員已經分離,改變原先物件引用型別成員的值並不會對複製物件的引用型別成員值造成影響。

參考資料

※ 《.net之美》--張子陽,感謝寫了這麼好的書!

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...