專案中,經常會遇到要建立乙個物件的副本作為臨時變數或其它用途,需要new乙個新物件出來,
然後把源物件的各個屬性賦值給這個新物件,這樣,及時改變了新物件的屬性,源物件也不會發生改變,即深拷貝。
顯然,硬編碼地把物件的乙個個屬性賦值給另外乙個物件,不僅繁瑣,而且容易出錯,物件的類刪掉乙個屬性,
則這個副本需「減掉」這個屬性。
以employee類為例,下面的**實現了employee的深拷貝與淺拷貝:
employee類:
[serializable]view codepublic
class
employee:icloneable
public
int age
//注意department類要貼上序列化的的標記[serializable],
//因為employee要被序列化,其所有屬性都要可被序列化
public department department
//////
深拷貝
/// ///
public
employee deepclone()
}//////
淺拷貝
/// ///
public
employee shallowclone()
//////
建立當前system.object的淺表副本
/// ///
public
object
clone()
}
department類:
[serializable]view codepublic
class
department
public
override
string
tostring()
}
main方法:
staticview codevoid main(string
args)
};//淺拷貝
//employee emp2 = emp1.shallowclone() as employee;
//深拷貝
employee emp2=emp1.deepclone() as
employee;
//修改emp2,emp1的各個屬性不會被修改
emp2.idcode = "
10087";
emp2.age = 24
; emp2.department.name= "
研發部"
;
//輸出驗證
console.writeline("
編號:,部門:,年齡:
",emp1.idcode,emp1.department,emp1.age);
console.writeline(
"編號:,部門:,年齡:
", emp2.idcode, emp2.department, emp2.age);
console.readkey();
}
執行截圖:
總結:emp2為emp1深拷貝的副本,修改emp2的屬性,emp1的屬性不會改變。
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝與深拷貝
淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...