国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C#復制和深度復制的實現方法

2020-05-23 13:56:23
字體:
來源:轉載
供稿:網友

深度復制與淺表復制的區別在于,淺表復制只復制值類型的值,而對于實例所包含的對象依然指向原有實例。

 class Program  {    [Serializable]    public class Car     {      public string name;      public Car(string name)      {        this.name = name;      }    }    [Serializable]    public class Person:ICloneable    {      public int id;      public string name;      public Car car;      public Person()      {      }      public Person(int id, string name, Car car)      {        this.id = id;        this.name = name;        this.car = car;      }      public Object Clone() //實現ICloneable接口,達到淺表復制。淺表復制與深度復制無直接有關系。 對外提供一個創建自身的淺表副本的能力      {        return this.MemberwiseClone();      }    }    //要復制的實例必須可序列化,包括實例引用的其它實例都必須在類定義時加[Serializable]特性。    public static T Copy<T>(T RealObject)    {      using (Stream objectStream = new MemoryStream())      {        //利用 System.Runtime.Serialization序列化與反序列化完成引用對象的復制          IFormatter formatter = new BinaryFormatter();        formatter.Serialize(objectStream, RealObject);        objectStream.Seek(0, SeekOrigin.Begin);        return (T)formatter.Deserialize(objectStream);      }    }         static void Main(string[] args)    {      Person p1 = new Person(1, "Scott", new Car("寶馬"));      Console.WriteLine("原始值:P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);      Person p2 = Copy<Person>(p1); //克隆一個對象      Person p3 = p1.Clone() as Person;//淺表復制      Console.WriteLine("改變P1的值");      p1.id = 2;      p1.name = "Lacy";      p1.car.name = "紅旗";      Console.WriteLine("P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);      Console.WriteLine("深度復制:P2:id={0}----------->name={1}------>car={2}", p2.id, p2.name, p2.car.name);      Console.WriteLine("淺表復制:P3:id={0}----------->name={1}------>car={2}", p3.id, p3.name, p3.car.name);      Console.ReadKey();    }

運行結果:

C#,復制,深度復制

一、List<T>對象中的T是值類型的情況(int 類型等)

對于值類型的List直接用以下方法就可以復制:

List<T> oldList = new List<T>(); oldList.Add(..); List<T> newList = new List<T>(oldList); 

二、List<T>對象中的T是引用類型的情況(例如自定義的實體類)

1、對于引用類型的List無法用以上方法進行復制,只會復制List中對象的引用,可以用以下擴展方法復制:

static class Extensions  {      public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable      {          return listToClone.Select(item => (T)item.Clone()).ToList();      }  //<SPAN style="COLOR: #000000">當然前題是List中的對象要實現ICloneable接口</SPAN> } 

2、另一種用序列化的方式對引用對象完成深拷貝,此種方法最可靠

public static T Clone<T>(T RealObject) {    using (Stream objectStream = new MemoryStream())    {       //利用 System.Runtime.Serialization序列化與反序列化完成引用對象的復制       IFormatter formatter = new BinaryFormatter();        formatter.Serialize(objectStream, RealObject);        objectStream.Seek(0, SeekOrigin.Begin);        return (T)formatter.Deserialize(objectStream);    } } 

3、利用System.Xml.Serialization來實現序列化與反序列化

public static T Clone<T>(T RealObject) {       using(Stream stream=new MemoryStream())      {        XmlSerializer serializer = new XmlSerializer(typeof(T));        serializer.Serialize(stream, RealObject);        stream.Seek(0, SeekOrigin.Begin);        return (T)serializer.Deserialize(stream);      }}

以上這篇C#復制和深度復制的實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 信阳市| 厦门市| 张家川| 兖州市| 浦东新区| 辽阳县| 都安| 镇江市| 屯门区| 奎屯市| 元谋县| 门头沟区| 宜君县| 辽源市| 阿拉善右旗| 伊通| 康马县| 南京市| 贵州省| 巴彦淖尔市| 宝鸡市| 家居| 阿拉尔市| 宝兴县| 抚顺市| 汕头市| 广元市| 攀枝花市| 宁陕县| 鄯善县| 咸阳市| 拉孜县| 大英县| 庆云县| 鄂托克前旗| 石河子市| 封丘县| 云浮市| 察雅县| 奈曼旗| 虎林市|