亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2020-01-24 01:43:47
字體:
來源:轉載
供稿:網友

Object.MemberwiseClone 方法

創建當前 Object 的淺表副本。

protected Object MemberwiseClone()

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

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

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

這些要求包括:

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

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

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

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

 下面的示例演示 MemberwiseClone 方法。 它定義了 ShallowCopy 方法,該方法通過調用 MemberwiseClone 方法來在 Person 對象上執行淺表復制操作。 它還定義了在 Person 對象上執行深層復制操作的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

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

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

這樣一個對象的深度復制就完成了。在原型設計模式中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] 也發生了變化 而 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();    }  }}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲视频一区| 久久久久久久久爱| 日韩精品免费在线视频| 欧美激情三级免费| 国产亚洲欧洲高清一区| 亚洲xxxx3d| 国产婷婷97碰碰久久人人蜜臀| 中文字幕欧美在线| 国产亚洲精品久久久久久牛牛| 久久久久国产一区二区三区| 国产日韩在线观看av| 亚洲高清不卡av| 亚洲国产一区二区三区在线观看| 久久久久久久激情视频| 插插插亚洲综合网| 久久精品在线视频| 亚洲国产天堂久久国产91| 亚洲天堂网在线观看| 国产美女久久久| 日韩在线观看免费高清完整版| 中文字幕亚洲欧美日韩在线不卡| 欧美又大又硬又粗bbbbb| 精品国产999| 在线看欧美日韩| 亚洲欧美在线免费| 亚洲a级在线观看| 精品激情国产视频| 一区二区三区黄色| 日韩美女福利视频| 92福利视频午夜1000合集在线观看| 亚洲综合在线小说| 欧美午夜精品在线| 热99在线视频| 国产精品久久久久91| 亚洲久久久久久久久久| 欧美国产视频日韩| 国产美女久久精品| 青青草国产精品一区二区| 精品国内产的精品视频在线观看| 亚洲欧洲第一视频| 色婷婷**av毛片一区| 久久这里有精品视频| 欧美午夜美女看片| 欧美韩国理论所午夜片917电影| 亚洲国产精品成人精品| 国产精品欧美日韩一区二区| 亚洲精品99久久久久| 亚洲天堂免费观看| 亚洲人线精品午夜| 欧美一级大片在线免费观看| 亚洲欧洲美洲在线综合| 日韩网站在线观看| 亚洲精品久久久久中文字幕欢迎你| 奇米四色中文综合久久| 一道本无吗dⅴd在线播放一区| 亚洲色图第一页| 高清亚洲成在人网站天堂| 欧美综合在线观看| 精品久久久久久国产| 亚洲品质视频自拍网| 国产97在线视频| 国产欧美日韩丝袜精品一区| 日韩国产高清污视频在线观看| 亚洲va码欧洲m码| 亚洲黄色av女优在线观看| 91精品国产沙发| 国产精品久久久久久五月尺| 欧美成人在线影院| 亚洲欧美日韩第一区| 欧美午夜性色大片在线观看| 精品视频在线观看日韩| 国内揄拍国内精品少妇国语| 久久视频在线观看免费| 久久久久久com| 国产精品欧美一区二区| 欧美另类暴力丝袜| 青草成人免费视频| 欧美亚洲免费电影| 国产一区香蕉久久| 欧美另类老女人| 欧美成人性色生活仑片| 日产日韩在线亚洲欧美| 77777少妇光屁股久久一区| 成人午夜激情免费视频| 欧美激情va永久在线播放| www.亚洲一区| 国产欧美日韩中文字幕| 亚洲激情视频在线| 精品亚洲精品福利线在观看| 久久男人资源视频| 国产成人精品免高潮在线观看| 精品久久久91| 国产精品69精品一区二区三区| 91精品视频在线免费观看| 92国产精品久久久久首页| 精品国产91久久久久久老师| 亚洲一区二区三区四区视频| 国产69精品久久久久99| 98精品国产自产在线观看| 国产精品久久久久影院日本| 国产精品入口日韩视频大尺度| 亚洲a在线播放| 亚洲人成伊人成综合网久久久| 国语对白做受69| 欧洲亚洲女同hd| 精品国内产的精品视频在线观看| 欧日韩不卡在线视频| 久久综合网hezyo| 欧美小视频在线观看| 久久久999国产精品| 精品福利免费观看| 成人av色在线观看| 欧美精品激情在线| 国产自摸综合网| 欧美国产日韩一区二区三区| 亚洲欧美中文日韩在线v日本| 992tv成人免费视频| 国产欧美日韩专区发布| 久久久精品999| 美女黄色丝袜一区| 欧美做爰性生交视频| 亚洲天堂第二页| 日本不卡视频在线播放| 国产在线观看不卡| 91精品国产91久久久久久最新| 国产精品久久久| 性色av一区二区三区在线观看| 亚洲精品日产aⅴ| 亚洲欧洲一区二区三区在线观看| 亚洲三级黄色在线观看| 亚洲第一黄色网| 国内精品久久久久伊人av| 亚洲欧美一区二区三区情侣bbw| 国产精品18久久久久久首页狼| 免费99精品国产自在在线| 国产一区二区三区高清在线观看| 国产精品女视频| 日本一区二三区好的精华液| 日韩av在线免费播放| 国产一区二区三区精品久久久| 日韩av一区二区在线| 国内精品视频一区| 欧美一级视频一区二区| 欧美午夜片欧美片在线观看| 欧美极品在线播放| 日韩欧美成人网| 亚洲欧美日韩高清| 成人久久18免费网站图片| 午夜精品久久久久久久99热| 日韩在线视频国产| 国产亚洲视频中文字幕视频| 色偷偷噜噜噜亚洲男人的天堂| 欧美在线视频免费播放| 97在线视频免费观看| 欧美日韩精品在线观看| 成人免费xxxxx在线观看| 91高清视频在线免费观看| 92版电视剧仙鹤神针在线观看| 国内精品一区二区三区四区| 亚洲视频日韩精品| 欧美日韩国产精品| 久久天堂av综合合色| 国产成人精品久久二区二区91| 在线观看久久久久久|