學無止境,精益求精
十年河東,十年河西,莫欺少年窮
學歷代表你的過去,能力代表你的現在,學習代表你的將來
最近拜讀了大話設計模式:原型模式,該模式主要應用c# 深淺複製來實現的!關於深淺複製大家可參考msdn:
所謂深淺複製可解讀為:
淺複製:在c#中呼叫 memberwiseclone() 方法即為淺複製。如果欄位是值型別的,則對字段執行逐位複製,如果欄位是引用型別的,則複製物件的引用,而不複製物件,因此:原始物件和其副本引用同乙個物件!
深複製:如果欄位是值型別的,則對字段執行逐位複製,如果欄位是引用型別的,則把引用型別的物件指向
乙個全新的物件!
上述的解釋可能看不太懂,我們作如下案例進行分析:
classview codeprogram
public
static
void
displayvalues(person p)
, age:
", p.name, p.age);
console.writeline(
"value:
", p.idinfo.idnumber);}}
public
class
idinfo
}public
class
person
public
person deepcopy()
}
上述**分析如下:
原始物件p1,通過淺複製得到物件p2,通過深複製得到p3
原始物件p1中的值型別屬性有:age 和 name ,引用型別物件有:idinfo
根據上述深複製的概念可知:p3中的age 和 name 相對於 p1是全新的,但p3中的 idinfo 和 p1中的 idinfo 不是同乙個物件,也就是說 p3中的idinfo是乙個全新的物件,開闢了自己的記憶體位址!
上述**測試如下:
我們現在講**修改如下:
public在輸出p2之前,我們修改了p1物件的值型別name 和 引用型別 idinfo 。static
void
main()
無論是淺複製還是深複製,副本中的值型別都是全新的!
淺複製中原始物件和副本的引用型別指向同一記憶體位址,所以,修改了p1的idinfo會同時影響p2的idinfo
輸出如下:
繼續修改**,如下:
public深複製中原始物件和副本的引用型別指向各自的位址,兩者完全是兩個不同的物件!因此:修改p1不會影響p3static
void
main()
so,是不是很簡單,是不是很easy.
深淺複製主要用於當建立乙個物件需要消耗過多資源時,可以採取複製的方法提公升效率!
大話設計模式的原話是這樣滴:當你new乙個物件時,每new一次,都需要執行乙個建構函式,如果
建構函式的執行時間很長
,那麼多次new物件時會大大拉低程式執行效率,因此:一般在初始化資訊不發生變化的前提下,轉殖是最好的辦法,這既隱藏了物件的建立細節,又大大提公升了效能!
當然,如果每個類都要寫自己的深複製,這豈不是非常非常麻煩,因此,有乙個通用的深複製方法,如下:
//////通用的深複製方法
/// ///
[serializable]
public
class baseclone
}
classview codeprogram
public
static
void
displayvalues(person p)
, age:
", p.name, p.age);
console.writeline(
"value:
", p.idinfo.idnumber);}}
[serializable]
public
class
idinfo
}[serializable]
public
class person : baseclone
public
person deepcopy()
public
override
person clone()
}//////
通用的深複製方法
/// ///
[serializable]
public
class baseclone
}
@陳臥龍的部落格
oc 深淺複製
淺 復 制 在複製操作時,對於被複製的物件的每一層複製都是指標複製。深 復 制 在複製操作時,對於被複製的物件至少有一層複製是物件複製。完全複製 在複製操作時,對於被複製的物件的每一層複製都是物件複製。注 1 在複製操作時,對於物件有n層是物件複製,我們可稱作n級深複製,此處n應大於等於1。2 對於...
深淺複製 2
前面講了深淺複製的概念,而實操中我們會遇到更多的情況 我們可以看到這兩個copywithzone方法在arc下已經是放棄了,這兩個方法的使用非常簡單,一般的格式如下 1.實現nscopying協議 2.實現copywithzone方法 3.呼叫 我們看看結果 結果非常明顯了,這類似於上篇所講的情況,...
Python 深淺複製
python中的賦值語句不複製物件,它們在目標和物件之間建立繫結。對於可變的或包含可變項的容器,有時需要乙個副本,所以可以改變乙個副本而不改變另乙個。將建立乙個新物件,但它包含的是對原始物件包含的項的引用。a b list a c a.copy d copy.copy a 建立乙個新物件,並且遞迴的...