【问题标题】:How to force a deep copy when copying structs with arrays?复制带有数组的结构时如何强制进行深层复制?
【发布时间】:2010-04-24 21:15:58
【问题描述】:

如果有

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

我真的必须实现自己的DeepClone 方法并每次都调用它吗?这将非常容易出错......

【问题讨论】:

    标签: c#


    【解决方案1】:

    一般来说,您应该避免将可变引用类型(如 Array)放入结构中。请参阅this question 并回答。

    所以让你的类成为一个引用类型并给它一个 DeepCopy 方法。甚至更好 - 让你的类型不可变,这样你就不需要复制了。

    【讨论】:

    • +1:如果可以的话,最好保持简单的类不可变,因为这样可以减少使用它们时出错的可能性。例如,即使您实现了 Deep Copy,也不能保证您的代码的使用者会真正使用它。特别是对于结构,可变性是非常出乎意料的。
    【解决方案2】:

    需要自己实现深拷贝方法。

    API 设计人员通常会设计 Clone()Clone(bool deep)Copy() 方法来执行此操作。

    ICloneable 有时用于标记类是可克隆的,但它可能会造成混淆,因为它没有指定 Clone() 方法是深还是浅。 Why should I implement ICloneable in c#?.

    【讨论】:

      【解决方案3】:

      没有办法做到这一点。您需要实现自己的深拷贝机制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        • 1970-01-01
        相关资源
        最近更新 更多