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

簡單談談C#中深拷貝、淺拷貝

 更新時間:2015年06月16日 08:57:14   投稿:hebedich  
深拷貝和淺拷貝都是對對象進行的拷貝復制。而他們的不同就在于:一個對象中可能會有值類型的字段,也可能會有引用類型的字段。淺拷貝直接拷貝值、引用類型的指針。而深拷貝則是重新構造字段指針所指向的對象,并沒有拷貝該字段的指針,或是與該字段指針指向同一塊內存

Object.MemberwiseClone 方法

創(chuàng)建當前 Object 的淺表副本。

protected Object MemberwiseClone()

MemberwiseClone 方法創(chuàng)建一個淺表副本,方法是創(chuàng)建一個新對象,然后將當前對象的非靜態(tài)字段復制到該新對象。 如果字段是值類型的,則對該字段執(zhí)行逐位復制。 如果字段是引用類型,則復制引用但不復制引用的對象;因此,原始對象及其復本引用同一對象。

例如,考慮對象X引用對象 A 和 B , 對象 B 依次引用對象 C。 X 的淺表副本創(chuàng)建一個新對象 X2,該對象也引用對象 A 和 B。 相比而言,X 的深層副本創(chuàng)建一個新對象 X2,該對象引用新對象 A2 和 B2(分別為 A 和 B 的副本)。 B2 又引用新對象 C2,C2 是 C 的副本。 該示例闡釋了淺層和深層復制操作之間的區(qū)別。

有很多方法可以實現(xiàn)深層復制操作,前提是淺表復制操作由 MemberwiseClone 方法執(zhí)行但不符合您的需求。

這些要求包括:

調用要復制的對象的類構造函數(shù)以創(chuàng)建含有從第一個對象中提出的屬性值的第二個對象。 這假定對象的值完全由類構造函數(shù)定義。

調用 MemberwiseClone 方法創(chuàng)建的對象的淺表副本,然后將指定新的對象,其值均相同,原始對象的任何屬性或字段的值是引用類型。 該示例中的 DeepCopy 方法闡釋了這種方法。

序列化要深層復制的對象,然后將序列化的數(shù)據(jù)還原到另一個對象變量。

使用帶遞歸的反射執(zhí)行的深層復制操作。

 下面的示例演示 MemberwiseClone 方法。 它定義了 ShallowCopy 方法,該方法通過調用 MemberwiseClone 方法來在 Person 對象上執(zhí)行淺表復制操作。 它還定義了在 Person 對象上執(zhí)行深層復制操作的DeepCopy 方法。

using System;
 
public class IdInfo
{
  public int IdNumber;
 
  public IdInfo(int IdNumber)
  {
    this.IdNumber = IdNumber;
  }
}
 
public class Person
{
  public int Age;
  public string Name;
  public IdInfo IdInfo;
 
  public Person ShallowCopy()
  {
    return (Person)this.MemberwiseClone();
  }
 
  public Person DeepCopy()
  {
    Person other = (Person) this.MemberwiseClone();
    other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
    return other;
  }
}
 
public class Example
{
  public static void Main()
  {
    // Create an instance of Person and assign values to its fields.
    Person p1 = new Person();
    p1.Age = 42;
    p1.Name = "Sam";
    p1.IdInfo = new IdInfo(6565);
 
    // Perform a shallow copy of p1 and assign it to p2.
    Person p2 = (Person) p1.ShallowCopy();
 
    // Display values of p1, p2
    Console.WriteLine("Original values of p1 and p2:");
    Console.WriteLine("  p1 instance values: ");
    DisplayValues(p1);
    Console.WriteLine("  p2 instance values:");
    DisplayValues(p2);
 
    // Change the value of p1 properties and display the values of p1 and p2.
    p1.Age = 32;
    p1.Name = "Frank";
    p1.IdInfo.IdNumber = 7878;
    Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
    Console.WriteLine("  p1 instance values: ");
    DisplayValues(p1);
    Console.WriteLine("  p2 instance values:");
    DisplayValues(p2);
 
    // Make a deep copy of p1 and assign it to p3.
    Person p3 = p1.DeepCopy();
    // Change the members of the p1 class to new values to show the deep copy.
    p1.Name = "George";
    p1.Age = 39;
    p1.IdInfo.IdNumber = 8641;
    Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
    Console.WriteLine("  p1 instance values: ");
    DisplayValues(p1);
    Console.WriteLine("  p3 instance values:");
    DisplayValues(p3);
  }
 
  public static void DisplayValues(Person p)
  {
    Console.WriteLine("   Name: {0:s}, Age: {1:d}", p.Name, p.Age);
    Console.WriteLine("   Value: {0:d}", p.IdInfo.IdNumber);
  }
}
// The example displays the following output:
//    Original values of p1 and p2:
//     p1 instance values:
//       Name: Sam, Age: 42
//       Value: 6565
//     p2 instance values:
//       Name: Sam, Age: 42
//       Value: 6565
//   
//    Values of p1 and p2 after changes to p1:
//     p1 instance values:
//       Name: Frank, Age: 32
//       Value: 7878
//     p2 instance values:
//       Name: Sam, Age: 42
//       Value: 7878
//   
//    Values of p1 and p3 after changes to p1:
//     p1 instance values:
//       Name: George, Age: 39
//       Value: 8641
//     p3 instance values:
//       Name: Frank, Age: 32
//       Value: 7878

為了實現(xiàn)深度復制,我們就必須遍歷有相互引用的對象構成的圖,并需要處理其中的循環(huán)引用結構。這無疑是十分復雜的。幸好借助.Net的序列化和反序列化機制,可以十分簡單的深度Clone一個對象。

原理很簡單,首先將對象序列化到內存流中,此時對象和對象引用的所用對象的狀態(tài)都被保存到內存中。.Net的序列化機制會自動處理循環(huán)引用的情況。然后將內存流中的狀態(tài)信息反序列化到一個新的對象中。

這樣一個對象的深度復制就完成了。在原型設計模式中CLONE技術非常關鍵。

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace CloneDemo
{
  [Serializable]
  class DemoClass
  {
    public int i = 0;
    public int[] iArr = { 1, 2, 3 };
 
    public DemoClass Clone1() //淺CLONE
    {
      return this.MemberwiseClone() as DemoClass;
    }
 
    public DemoClass Clone2() //深clone
    {
      MemoryStream stream = new MemoryStream();
      BinaryFormatter formatter = new BinaryFormatter();
      formatter.Serialize(stream, this);
      stream.Position = 0;
      return formatter.Deserialize(stream) as DemoClass;
    }
  }
 
  class Program
  {
    static void Main(string[] args)
    {
      DemoClass a = new DemoClass();
      a.i = 10;
      a.iArr = new int[] { 8, 9, 10 };
      DemoClass b = a.Clone1();
      DemoClass c = a.Clone2();
 
      // 更改 a 對象的iArr[0], 導致 b 對象的iArr[0] 也發(fā)生了變化 而 c不會變化
       a.iArr[0] = 88;
 
      Console.WriteLine("MemberwiseClone");
      Console.WriteLine(b.i);
      foreach (var item in b.iArr)
      {
        Console.WriteLine(item);
      }
 
      Console.WriteLine("Clone2");
      Console.WriteLine(c.i);
      foreach (var item in c.iArr)
      {
        Console.WriteLine(item);
      }
 
      Console.ReadLine();
    }
  }
}

以上所述就是本文的全部內容了,希望大家能夠喜歡。

相關文章

  • c# 使用Json.NET實現(xiàn)json序列化

    c# 使用Json.NET實現(xiàn)json序列化

    這篇文章主要介紹了詳解C#中的JSON序列化方法,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-05-05
  • C#基于Socket實現(xiàn)簡單聊天室功能

    C#基于Socket實現(xiàn)簡單聊天室功能

    這篇文章主要為大家詳細介紹了C#基于Socket實現(xiàn)簡單聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • .NET實現(xiàn):將EXE設置開機自動啟動

    .NET實現(xiàn):將EXE設置開機自動啟動

    .NET實現(xiàn):將EXE設置開機自動啟動的方法,需要的朋友可以參考一下
    2013-03-03
  • c# 值類型實例構造器

    c# 值類型實例構造器

    CLR總是允許創(chuàng)建值類型的實例。另外值類型不一定需要定義構造器,c#編譯器不會為值類型生成默認的無參構造器
    2012-10-10
  • C#集合之自定義集合類

    C#集合之自定義集合類

    這篇文章介紹了C#集合之自定義集合類,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#中計算時間差中的小數(shù)問題解決

    C#中計算時間差中的小數(shù)問題解決

    C#中計算時間差中的小數(shù)問題解決需要的朋友可以參考一下
    2013-03-03
  • C# 導出Excel的6種簡單方法實現(xiàn)

    C# 導出Excel的6種簡單方法實現(xiàn)

    C# 導出 Excel 的6種簡單方法:數(shù)據(jù)表導出到 Excel,對象集合導出到 Excel,數(shù)據(jù)庫導出到 Excel,微軟網(wǎng)格控件導出到 Excel,數(shù)組導出到 Excel,CSV 導出到 Excel,你都會了嗎?需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • AnyChat的視頻會議程序實例詳解

    AnyChat的視頻會議程序實例詳解

    AnyChat是一款跨平臺的音視頻解決方案。通過本篇文章給大家介紹AnyChat的視頻會議程序,涉及到anychat相關知識,對anychat視頻會議相關知識感興趣的朋友一起學習吧
    2016-01-01
  • 關于C#基礎知識回顧--反射(一)

    關于C#基礎知識回顧--反射(一)

    其實說白了,反射就是能知道我們未知類型的類型信息這么一個東西.沒什么神秘可講!反射的核心是System.Type。System.Type包含了很多屬性和方法,使用這些屬性和方法可以在運行時得到類型信息
    2013-07-07
  • C# 通過同步和異步實現(xiàn)優(yōu)化做早餐的時間

    C# 通過同步和異步實現(xiàn)優(yōu)化做早餐的時間

    本文以一個簡單的小例子—如何做一頓早餐及如何優(yōu)化做早餐的時間來讓大家具體了解一下同步和異步方法的區(qū)別,需要的朋友可以參考一下
    2021-12-12

最新評論

濮阳市| 英吉沙县| 嵊州市| 门头沟区| 陈巴尔虎旗| 马尔康县| 南江县| 来安县| 神木县| 本溪市| 将乐县| 平乐县| 南郑县| 连平县| 瑞安市| 广平县| 库车县| 晋宁县| 博爱县| 盖州市| 广宁县| 南江县| 辉县市| 绍兴市| 仁寿县| 邮箱| 灵山县| 南召县| 固原市| 东方市| 西盟| 宜宾县| 蓬安县| 佛教| 华容县| 灌云县| 开远市| 鄂温| 青冈县| 驻马店市| 北安市|