c#构造类如何进行对象复制

avatar
作者
筋斗云
阅读量:0

在C#中,可以使用多种方法来复制对象,包括深拷贝和浅拷贝。以下是一些常用的方法:

  1. 使用MemberwiseClone()方法进行浅拷贝。这个方法会创建一个新对象,并将原始对象的所有字段复制到新对象中。但是,如果字段是引用类型,则只会复制引用,而不会复制引用的对象。这意味着,如果原始对象的字段引用了另一个对象,则复制后的对象和原始对象将共享该对象。

示例代码:

public class MyClass {     public int MyProperty { get; set; }     public List<MyOtherClass> MyListProperty { get; set; }      public MyClass ShallowCopy()     {         return (MyClass)MemberwiseClone();     } } 
  1. 使用BinaryFormatter类进行深拷贝。这个方法会创建一个新对象,并将原始对象的所有字段复制到新对象中,包括引用类型的字段所引用的对象。这意味着,复制后的对象和原始对象将不共享任何对象。

示例代码:

[Serializable] public class MyClass {     public int MyProperty { get; set; }     public List<MyOtherClass> MyListProperty { get; set; }      public MyClass DeepCopy()     {         using (MemoryStream ms = new MemoryStream())         {             BinaryFormatter formatter = new BinaryFormatter();             formatter.Serialize(ms, this);             ms.Position = 0;             return (MyClass)formatter.Deserialize(ms);         }     } } 

需要注意的是,使用BinaryFormatter进行深拷贝可能会存在安全问题,因为它可以反序列化任意代码。因此,这种方法不建议在不可信的环境中用于深拷贝。

另外,如果你使用的是C# 8.0或更高版本,可以使用Clone方法进行深拷贝。这个方法需要你的类实现ICloneable接口,并重写Clone方法来递归地复制所有引用类型的字段。

示例代码:

public class MyClass : ICloneable {     public int MyProperty { get; set; }     public List<MyOtherClass> MyListProperty { get; set; }      public object Clone()     {         return new MyClass         {             MyProperty = this.MyProperty,             MyListProperty = new List<MyOtherClass>(this.MyListProperty)         };     } } 

在这个示例中,Clone方法创建了一个新的MyClass对象,并将原始对象的MyPropertyMyListProperty字段复制到新对象中。注意,MyListProperty字段被复制为一个新的列表对象,而不是共享原始列表对象。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!