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