詳解 c 轉殖

2022-06-05 19:48:09 字數 2761 閱讀 9305

這篇文章主要介紹了詳解 c# 轉殖的相關資料,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

轉殖方法是原型設計模式中必須使用的方式,它將返回乙個與當前物件資料一致的物件。正如其名,猶如乙個模子雕刻而出。轉殖型別分為兩種:淺轉殖、深轉殖。

1、淺轉殖

淺轉殖方式是最簡單、最直接的方式。只需要類實現介面icloneable(在命名空間system.runtime.interopservices下)的clone方法,在方法中使用加入對當前類的memberwiseclone()方法即可。在淺轉殖中,如果原型物件的成員變數是值型別,將複製乙份給轉殖物件;如果原型物件的成員變數是引用型別,則將引用物件的位址複製乙份給轉殖物件。

引用型別

8///

9public

object obj

1011

public

object

clone()

1215 }

以上方法實現了對類物件的淺轉殖方式。但是在該類中具有引用型別字段,淺轉殖方法無法對引用字段進行轉殖,引用字段僅僅是對其進行了位址引用。所以,當修改原本或者副本的引用欄位的資料時,另乙個物件的引用物件的資料同樣會變化。深轉殖將有效的解決此問題。

2、深轉殖

深轉殖相對於淺轉殖方式比較複雜。深轉殖是無論原型物件的成員變數是值型別還是引用型別,都將複製乙份給轉殖物件,深轉殖將原型物件的所有引用物件也複製乙份給轉殖物件。

深轉殖實現的機制是將物件進行序列化為資料後,再次將資料反序列化為新的物件。序列化就是將物件寫到流的過程,寫到流中的物件是原有物件的乙個拷貝,而原物件仍然存在於記憶體中。通過序列化實現的拷貝不僅可以複製物件本身,而且可以複製其引用的成員物件,因此通過序列化將物件寫到乙個流中,再從流裡將其讀出來,可以實現深轉殖。注意,在實現序列化前需要在類的上方標記為可序列化。本文採用的序列化方式為二進位制序列化。

主要實現的**如下:

1 [serializable]//

標記特性:可序列化

2public

class

student38

///9

///引用型別

10///

11public

object obj

1213

public

student clone( )

1425

catch

(serializationexception e)

2630}31

return

clone;32}

33 }

深轉殖實現機制相對複雜、效率稍慢,但它克服了淺轉殖方式的不足,使得轉殖物件時將類中的引用型別資料完全轉殖為新的物件,而不是引用原本中的物件。如此,在修改雙方的引用型別物件的資料時不會對另一方造成干擾。

但為每乙個類都實現轉殖方式,而重複書寫相同**未免麻煩。因此引入泛型方法。

3、泛型方法實現轉殖

1

public

class

clone221

catch

(serializationexception e)

2226}27

return

clone;28}

29 }

在外部使用的方法如下:

1  student stu1 = new student();//

例項化乙個物件

2 stu1.obj = new

object();//

例項化物件中的引用物件

3 student stu2 = clone.depthclone(stu1);//

深轉殖物件

4、擴充套件方法擴充套件方法的出現可以很好的解決類自身直接呼叫轉殖方法,而不需要呼叫靜態類的方法,返回物件值。但其本身與泛型方法類似,不過為了使所有類都能使用定義的深轉殖方法,此處使用對頂級類object進行方法的擴充套件,其返回的值也是object型別。具體方法如下:

1

///2

///注:擴充套件方法必須在靜態類中

3///

4public

static

class

clone523

catch

(serializationexception e)

2428}29

return

clone;30}

31 }

使用方法示例:

1  student stu1 = new student();//

例項化乙個物件

2 stu1.obj = new

object();//

例項化物件中的引用物件

3 student stu2 = stu1.depthclone() as student;//

深轉殖物件;注意:在此需要將object物件轉換為我們需要的物件型別

c 深轉殖與淺轉殖

我們都知道memberwiseclone 會將淺轉殖。什麼是淺轉殖?如何深轉殖呢?public class good private static good good private static good good new good public good createinstance publi...

深度轉殖詳解以及實現

拷貝資料分為兩種型別 1 基本資料型別 拷貝後會生成乙份新的資料,修改拷貝以後的資料不會影響原資料 沒有深淺拷貝之說 2 物件 陣列 拷貝後不會生成新的資料,而拷貝的是引用,修改拷貝以後的資料會影響原來的資料 有深淺拷貝之說 注意 影響原資料的是淺拷貝 拷貝資料的方法 1 直接賦值給乙個變數 淺拷貝...

C 物件深度轉殖

有基礎的開發者都應該很明白,物件是乙個引用型別,例如 object b new object object a b 那麼a指向的是b的位址,這樣在有些時候就會造成如果修改a的值,那麼b的值也會跟隨著改變 a和b是同乙個引用記憶體位址 我們想要a和b都是各自互不影響的,那麼只能是完全地新建乙個新的物件...