C# 淺度和深度復(fù)制
從一個變量到另一個變量按值復(fù)制對象,而不是按引用復(fù)制對象(即以與結(jié)構(gòu)相同的方式復(fù)制)可能非常復(fù)雜。因為一個對象可能包含許多其他對象的引用,例如字段成員等,這將涉及許多繁雜的處理。把每個成員從一個對象復(fù)制到另一個對象中可能不會成功,因為其中一些成員可能是引用類型。
.NET Framework考慮了這個問題。簡單地按照成員復(fù)制對象可以通過派生于System.Object的 MemberwiseClone()方法來完成,這是一個受保護(hù)的方法,但很容易在對象上定義一個調(diào)用該方法的公共方法。這個方法提供的復(fù)制功能稱為淺度復(fù)制(shallow copy),因為它并未考慮引用類型成員。因此,新對象中的引用成員就會指向源對象中相同成員引用的對象,在許多情況下這并不理想。如果要創(chuàng)建成員的新實例(復(fù)制值,而不復(fù)制引用), 此時需要使用深度復(fù)制(deep copy).
可以實現(xiàn)一個ICloneable接口,以標(biāo)準(zhǔn)方式進(jìn)行深度復(fù)制。如果使用這個接口,就必須實現(xiàn)它包含的Clone()方法。這個方法返回一個類型為SysteiaObject的值。我們可以采用各種處理方式,實現(xiàn)所選的任何一個方法體來得到 這個對象。如果愿意,就可以進(jìn)行深度復(fù)制(但不是必須執(zhí)行深度復(fù)制,所以如果執(zhí)行淺度復(fù)制更合適,就可以執(zhí)行淺度復(fù)制)。對于該方法應(yīng)該返回什么,并不存在規(guī)則或限制,所以很多人建議不要使用它。這些人建議實現(xiàn)自己的深度復(fù)制方法。
點(diǎn)擊加載更多評論>>