中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

不忘(wang)本~淺拷(kao)貝(bei)和(he)深拷(kao)貝(bei)

返回目錄

Clone 分(fen)淺拷(kao)貝和(he)深拷(kao)貝

兩(liang)者的區別:當對象中的屬性是引(yin)用類型時,即類product中還有(you)對類category的引(yin)用時,淺拷貝與深拷貝才有(you)區別。

淺拷貝:復制的是category的引用,當原對象改變時,會影響新對象,反之,亦然。

深拷貝:復制的是category的值,即,它會new一個新的category,然后將原來的category元素的值復制到新元素,即它與原對象沒有任何關系,只是內容相同。

如何(he)實現對象的拷貝功能:

繼承接口ICloneable實現Clone方法
 ICloneable.Clone本身并不能區分(Deep or Shallow)你可以在Clone中調用MemberwiseClone來實現一個ShallowClone也可以自己來實現一個DeepClone。不過按照microsoft的建議當實現ICloneable的時候是準備用來實現一個DeepClone。
ICloneable.Clone返回類型是object
其中MemberwiseClone的(de)(de)復制原理是(shi)值(zhi)類(lei)(lei)(lei)型(xing)(xing)按位(wei)復制,引用(yong)類(lei)(lei)(lei)型(xing)(xing)復制對象(xiang)的(de)(de)引用(yong)。這里有(you)一(yi)個要注意的(de)(de)就是(shi)String類(lei)(lei)(lei)型(xing)(xing),雖然(ran)是(shi)引用(yong)類(lei)(lei)(lei)型(xing)(xing),不過(guo)在這里表現(xian)上(shang)和(he)值(zhi)類(lei)(lei)(lei)型(xing)(xing)是(shi)一(yi)樣的(de)(de),在Clone的(de)(de)時候(hou)就當作值(zhi)類(lei)(lei)(lei)型(xing)(xing)來看待好了(le)。

實現(xian)Clone的方法:

1. 手工克隆

一個能夠保證對象完全按照你所想的那樣進行克隆的方式是手工克隆對象的每一個域(field)。這種方式的缺點是麻煩而且容易出錯:如果你在類中增加了一個域,你很可能會忘記更新Clone方法。還要在克隆引用對象指向原始對象的時候,注意避免無限循環引用。下面是一個進行深拷貝的簡單例子:

 

2. 使用MemberWiseClone方法

是(shi)(shi) Object類(lei)的(de)受保護方法,能夠通過創建一個新對(dui)(dui)象(xiang)(xiang),并(bing)把所有當(dang)前對(dui)(dui)象(xiang)(xiang)中(zhong)(zhong)的(de)非靜態域(yu)復(fu)制到新對(dui)(dui)象(xiang)(xiang)中(zhong)(zhong),從而創建一個淺拷(kao)貝。對(dui)(dui)于值類(lei)型(xing)(xing)的(de)域(yu),進行(xing)的(de)是(shi)(shi)按(an)位(wei)拷(kao)貝。對(dui)(dui)于引用(yong)(yong)(yong)類(lei)型(xing)(xing)的(de)域(yu),引用(yong)(yong)(yong)會(hui)被賦值而引用(yong)(yong)(yong)的(de)對(dui)(dui)象(xiang)(xiang)則(ze)不會(hui)。因此(ci),原始(shi)對(dui)(dui)象(xiang)(xiang)及其克隆都(dou)會(hui)引用(yong)(yong)(yong)同一個對(dui)(dui)象(xiang)(xiang)。注(zhu)意,這種方法對(dui)(dui)派生類(lei)都(dou)是(shi)(shi)有效的(de),也就是(shi)(shi)說,你只需在基(ji)類(lei)中(zhong)(zhong)定義(yi)一次Clone方法。下面是(shi)(shi)一個簡單的(de)例子:

1 public class Person : ICloneable
2 {
3     public string Name;
4     public Person Spouse;
5     public object Clone()
6     {
7         return this.MemberwiseClone();
8     }
9 }

3. 用反射進行克隆

用反射(she)進行克隆是(shi)使用方(fang)法(fa)(fa)來創(chuang)建一(yi)個(ge)相同類(lei)型(xing)的(de)(de)(de)新(xin)對(dui)(dui)(dui)象,然(ran)后用反射(she)對(dui)(dui)(dui)所有域進行淺拷(kao)貝。這種方(fang)法(fa)(fa)的(de)(de)(de)優點是(shi)它(ta)是(shi)全自動的(de)(de)(de),不(bu)需要在對(dui)(dui)(dui)象中添加或刪除成(cheng)員的(de)(de)(de)時候(hou)修改克隆方(fang)法(fa)(fa)。另外它(ta)也能被(bei)寫(xie)成(cheng)提供深拷(kao)貝的(de)(de)(de)方(fang)法(fa)(fa)。缺點是(shi)使用了反射(she),因(yin)此會比較(jiao)慢(man),而(er)且(qie)在的(de)(de)(de)環境(jing)中是(shi)不(bu)可用的(de)(de)(de)。

4. 使用序列化進行克隆

克(ke)隆(long)一個(ge)對(dui)(dui)(dui)象的(de)最簡(jian)單的(de)方法(fa)是將(jiang)它(ta)序(xu)(xu)列(lie)化(hua)(hua)并(bing)立(li)刻反序(xu)(xu)列(lie)化(hua)(hua)為一個(ge)新(xin)對(dui)(dui)(dui)象。和(he)反射方法(fa)一樣,序(xu)(xu)列(lie)化(hua)(hua)方法(fa)是自動的(de),無需在對(dui)(dui)(dui)對(dui)(dui)(dui)象成(cheng)員(yuan)進行增刪的(de)時候做出修改。缺點(dian)是序(xu)(xu)列(lie)化(hua)(hua)比(bi)其他方法(fa)慢(man),甚至比(bi)用(yong)反射還慢(man),所(suo)有引用(yong)的(de)對(dui)(dui)(dui)象都必(bi)須是可序(xu)(xu)列(lie)化(hua)(hua)的(de)()。另外,取決于你所(suo)使用(yong)的(de)序(xu)(xu)列(lie)化(hua)(hua)的(de)類型(XML,SOAP,二進制)的(de)不同,私有成(cheng)員(yuan)可能不能像(xiang)期望的(de)那樣被克(ke)隆(long)。示例(li)代碼在,和(he)。

5. 使用IL進行克隆

一(yi)種(zhong)罕見的解決方(fang)案是使(shi)用IL(中間語言)來進行對象克(ke)隆(long)(long)。這(zhe)種(zhong)方(fang)式(shi)創建一(yi)個動態方(fang)法(DynamicMethod),獲(huo)取中間語言生成(cheng)器(ILGenerator),向方(fang)法中注入代(dai)碼,把它編譯成(cheng)一(yi)個委(wei)托,然后(hou)執行這(zhe)個委(wei)托。委(wei)托會被緩存(cun),因此中間語言只(zhi)在(zai)初次(ci)克(ke)隆(long)(long)的時候(hou)才會生成(cheng),后(hou)續的克(ke)隆(long)(long)都(dou)不會重新(xin)生成(cheng)一(yi)遍。盡管這(zhe)種(zhong)方(fang)法比使(shi)用反射快(kuai),但是這(zhe)種(zhong)方(fang)法難以理解和維(wei)護。

6. 使用擴展方法進行克隆

Havard Stranden用(yong)擴展方(fang)法(extention method)創建了一(yi)個(ge)。這個(ge)框架能夠創建對象(xiang)(xiang)及其引(yin)用(yong)的(de)(de)(de)對象(xiang)(xiang)的(de)(de)(de)深拷貝,不管對象(xiang)(xiang)結構有(you)多復雜。缺點是(shi),這是(shi)一(yi)個(ge)不提(ti)供(gong)源(yuan)代(dai)碼的(de)(de)(de)自定(ding)義(yi)框架(更新:現在已經包括(kuo)源(yuan)代(dai)碼了,參(can)見(jian)本文評論),并(bing)且它(ta)不能在不使用(yong)無參(can)數構造器的(de)(de)(de)時候(hou),拷貝由私有(you)方(fang)法創建的(de)(de)(de)對象(xiang)(xiang)。另一(yi)個(ge)問題,也是(shi)所有(you)自動(dong)化的(de)(de)(de)深克隆(long)方(fang)法共有(you)的(de)(de)(de)問題是(shi),深拷貝通(tong)常需要(yao)靈活地處理(li)不能進行簡單自動(dong)化特殊情(qing)況(例如(ru)未受管理(li)的(de)(de)(de)資源(yuan))。

返回目錄

posted @ 2011-07-27 17:17  張占嶺  閱讀(939)  評論(1)    收藏  舉報