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:如果可以的话,最好保持简单类不可变,因为这样可以减少使用它们时出错的可能性。例如,即使您实现了深度复制,也不能保证代码的使用者会实际使用它。特别是对于结构,易变性是非常出乎意料的。