最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解 c# 克隆

 更新時間:2020年11月21日 11:50:14   作者:一只獨行的猿  
這篇文章主要介紹了詳解 c# 克隆的相關(guān)資料,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

克隆方法是原型設(shè)計模式中必須使用的方式,它將返回一個與當(dāng)前對象數(shù)據(jù)一致的對象。正如其名,猶如一個模子雕刻而出。克隆類型分為兩種:淺克隆、深克隆。

1、淺克隆

淺克隆方式是最簡單、最直接的方式。只需要類實現(xiàn)接口ICloneable(在命名空間System.Runtime.InteropServices下)的Clone方法,在方法中使用加入對當(dāng)前類的MemberwiseClone()方法即可。在淺克隆中,如果原型對象的成員變量是值類型,將復(fù)制一份給克隆對象;如果原型對象的成員變量是引用類型,則將引用對象的地址復(fù)制一份給克隆對象。

如:

public class Student:ICloneable
{
  /// <summary>
  /// 值類型
  /// </summary>
  public int ID { get; set; }   /// <summary>
  /// 引用類型
  /// </summary>
  public object obj { get; set; }

  public object Clone()
  {
    return this.MemberwiseClone();
  }
}

以上方法實現(xiàn)了對類對象的淺克隆方式。但是在該類中具有引用類型字段,淺克隆方法無法對引用字段進行克隆,引用字段僅僅是對其進行了地址引用。所以,當(dāng)修改原本或者副本的引用字段的數(shù)據(jù)時,另一個對象的引用對象的數(shù)據(jù)同樣會變化。深克隆將有效的解決此問題。

2、深克隆

深克隆相對于淺克隆方式比較復(fù)雜。深克隆是無論原型對象的成員變量是值類型還是引用類型,都將復(fù)制一份給克隆對象,深克隆將原型對象的所有引用對象也復(fù)制一份給克隆對象。

深克隆實現(xiàn)的機制是將對象進行序列化為數(shù)據(jù)后,再次將數(shù)據(jù)反序列化為新的對象。序列化就是將對象寫到流的過程,寫到流中的對象是原有對象的一個拷貝,而原對象仍然存在于內(nèi)存中。通過序列化實現(xiàn)的拷貝不僅可以復(fù)制對象本身,而且可以復(fù)制其引用的成員對象,因此通過序列化將對象寫到一個流中,再從流里將其讀出來,可以實現(xiàn)深克隆。注意,在實現(xiàn)序列化前需要在類的上方標(biāo)記為可序列化。本文采用的序列化方式為二進制序列化。

主要實現(xiàn)的代碼如下:

[Serializable]//標(biāo)記特性:可序列化
 public class Student
 {
   /// <summary>
   /// 值類型
   /// </summary>
   public int ID { get; set; }
   /// <summary>
   /// 引用類型
   /// </summary>
   public object obj { get; set; }

   public Student Clone( )
   {
     Student clone = new Student();
     using (Stream stream = new MemoryStream())
     {
       IFormatter formatter = new BinaryFormatter();
       try
       {
         formatter.Serialize(stream, this);
         stream.Seek(0, SeekOrigin.Begin);
         clone = formatter.Deserialize(stream) as Student;
       }
       catch (SerializationException e)
       {
         Console.WriteLine("Failed to serialize. Reason: " + e.Message);
         throw;
       }
     }
     return clone;
   }
 }

深克隆實現(xiàn)機制相對復(fù)雜、效率稍慢,但它克服了淺克隆方式的不足,使得克隆對象時將類中的引用類型數(shù)據(jù)完全克隆為新的對象,而不是引用原本中的對象。如此,在修改雙方的引用類型對象的數(shù)據(jù)時不會對另一方造成干擾。

但為每一個類都實現(xiàn)克隆方式,而重復(fù)書寫相同代碼未免麻煩。因此引入泛型方法。

3、泛型方法實現(xiàn)克隆

泛型的出現(xiàn)使得可以良好的解決在多個類或結(jié)構(gòu)體中都需要進行克隆時重復(fù)編寫代碼的麻煩。在外部只需要使用相關(guān)方法即可。其代碼如下:

public class Clone
 {
   /// <summary>
   /// 深克隆
   /// </summary>
   /// <typeparam name="T"></typeparam>
   /// <param name="t"></param>
   /// <returns></returns>
   public static T DepthClone<T>(T t)
   {
     T clone = default(T);
     using (Stream stream = new MemoryStream())
     {
       IFormatter formatter = new BinaryFormatter();
       try
       {
         formatter.Serialize(stream, t);
         stream.Seek(0, SeekOrigin.Begin);
         clone = (T)formatter.Deserialize(stream);
       }
       catch (SerializationException e)
       {
         Console.WriteLine("Failed to serialize. Reason: " + e.Message);
         throw;
       }
     }
     return clone;
   }
 }

在外部使用的方法如下:

 Student stu1 = new Student();//實例化一個對象
 stu1.obj = new object();//實例化對象中的引用對象
 Student stu2 = Clone.DepthClone(stu1);//深克隆對象

4、擴展方法

擴展方法的出現(xiàn)可以很好的解決類自身直接調(diào)用克隆方法,而不需要調(diào)用靜態(tài)類的方法,返回對象值。但其本身與泛型方法類似,不過為了使所有類都能使用定義的深克隆方法,此處使用對頂級類Object進行方法的擴展,其返回的值也是object類型。具體方法如下:

/// <summary>
 /// 注:擴展方法必須在靜態(tài)類中
 /// </summary>
 public static class Clone
 {
   /// <summary>
   /// 深克隆
   /// </summary>
   /// <param name="obj">原始版本對象</param>
   /// <returns>深克隆后的對象</returns>
   public static object DepthClone(this object obj)
   {
     object clone = new object();
     using (Stream stream = new MemoryStream())
     {
       IFormatter formatter = new BinaryFormatter();
       try
       {
         formatter.Serialize(stream, obj);
         stream.Seek(0, SeekOrigin.Begin);
         clone = formatter.Deserialize(stream);
       }
       catch (SerializationException e)
       {
         Console.WriteLine("Failed to serialize. Reason: " + e.Message);
         throw;
       }
     }
     return clone;
   }
 }

使用方法示例:

 Student stu1 = new Student();//實例化一個對象
 stu1.obj = new object();//實例化對象中的引用對象
 Student stu2 = stu1.DepthClone() as Student;//深克隆對象;注意:在此需要將object對象轉(zhuǎn)換為我們需要的對象類型

以上就是詳解 c# 克隆的詳細(xì)內(nèi)容,更多關(guān)于c# 克隆的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Unity3D使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角

    Unity3D使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角

    這篇文章主要為大家詳細(xì)介紹了Unity3D使用鼠標(biāo)旋轉(zhuǎn)縮放平移視角,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • C# ComboBox的聯(lián)動操作(三層架構(gòu))

    C# ComboBox的聯(lián)動操作(三層架構(gòu))

    這篇文章主要介紹了C# ComboBox的聯(lián)動操作(三層架構(gòu)),根據(jù)下拉框的變化使得下拉框綁定對應(yīng)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • C#使用 NAudio 實現(xiàn)音頻可視化的方法

    C#使用 NAudio 實現(xiàn)音頻可視化的方法

    這篇文章主要介紹了[C#] 使用 NAudio 實現(xiàn)音頻可視化的相關(guān)資料,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • c#程序定期把內(nèi)存信息記錄到log日志示例

    c#程序定期把內(nèi)存信息記錄到log日志示例

    這篇文章主要介紹了c#程序定期把內(nèi)存信息記錄到log日志示例,需要的朋友可以參考下
    2014-04-04
  • C#使用GDI繪制直線的方法

    C#使用GDI繪制直線的方法

    這篇文章主要介紹了C#使用GDI繪制直線的方法,涉及C#中使用GDI繪圖的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#實現(xiàn)單鏈表(線性表)完整實例

    C#實現(xiàn)單鏈表(線性表)完整實例

    這篇文章主要介紹了C#實現(xiàn)單鏈表(線性表)的方法,結(jié)合完整實例形式分析了單鏈表的原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-06-06
  • c# rsa注冊實現(xiàn)加密文字

    c# rsa注冊實現(xiàn)加密文字

    這篇文章主要介紹了c# rsa注冊實現(xiàn)加密文字,需要的朋友可以參考下
    2014-04-04
  • C#實現(xiàn)XML文件讀取

    C#實現(xiàn)XML文件讀取

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)XML文件讀取的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 淺析wpf中datagrid顯示列的問題

    淺析wpf中datagrid顯示列的問題

    這篇文章主要為大家詳細(xì)介紹了wpf中datagrid顯示列問題的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以學(xué)習(xí)一下
    2024-04-04
  • C#使用DateTime獲取日期和時間的實現(xiàn)

    C#使用DateTime獲取日期和時間的實現(xiàn)

    在C#中,DateTime類是用來處理日期和時間的類,它具有許多屬性和方法,用于操作和獲取日期和時間的不同部分,本文就來介紹一下C#使用DateTime獲取,感興趣的可以了解一下
    2023-11-11

最新評論

汪清县| 石狮市| 巢湖市| 庄河市| 永川市| 奉新县| 邵东县| 金平| 佳木斯市| 隆昌县| 鄂温| 白山市| 乐平市| 丰县| 甘洛县| 汶上县| 伊春市| 前郭尔| 辉县市| 中超| 洪江市| 方正县| 江安县| 象山县| 盐津县| 锡林郭勒盟| 公主岭市| 桓仁| 沂源县| 天气| 象山县| 安陆市| SHOW| 江门市| 霍城县| 齐齐哈尔市| 平罗县| 新密市| 吉隆县| 庄河市| 吉林省|