C# 在使用数组复制结构时,如何强制深度复制?
如果你有C# 在使用数组复制结构时,如何强制深度复制?,c#,C#,如果你有 struct A { public double[] Data; public int X; } 使用operator=或将a的实例添加到容器时,如何强制执行深度复制 例如,问题是: A a = new A(); var list = new List<A>(); list.Add(a); // does not make a deep copy of Data A b = a; // does not make a deep copy of Data A A=
struct A {
public double[] Data;
public int X;
}
使用operator=
或将a
的实例添加到容器时,如何强制执行深度复制
例如,问题是:
A a = new A();
var list = new List<A>();
list.Add(a); // does not make a deep copy of Data
A b = a; // does not make a deep copy of Data
A A=新A();
var list=新列表();
列表。添加(a);//不制作数据的深度副本
A b=A;//不制作数据的深度副本
我真的必须实现自己的
DeepClone
方法并每次调用它吗?这极易出错…您需要自己实现深度复制方法
API设计人员通常会设计一个Clone()、Clone(bool deep)或Copy()方法来实现这一点
ICloneable有时用于标记类是可克隆的,但它可能会造成混淆,因为它没有指定Clone()方法是深层还是浅层 没办法。您需要实现自己的深度复制机制。通常,您应该避免将数组等可变引用类型放入结构中。请看并回答
因此,将类设为引用类型,并为其提供一个DeepCopy方法。或者更好—使您的类型不可变,这样您就不需要制作副本。+1:如果可以的话,最好保持简单类不可变,因为这样可以减少使用它们时出错的可能性。例如,即使您实现了深度复制,也不能保证代码的使用者会实际使用它。特别是对于结构,易变性是非常出乎意料的。