【问题标题】:C# - List member needs deep copy?C# - 列表成员需要深拷贝?
【发布时间】:2010-02-22 21:50:00
【问题描述】:

我有一个List<int> 成员的课程。如果我想克隆这个类的一个实例,是需要深拷贝还是MemberwiseClone()浅拷贝就够了?

如果至少有一个成员是对对象的引用,我们需要一个深拷贝,对吗?这是否意味着拥有 List、DateTime、String、MyClass 等需要深拷贝?

【问题讨论】:

  • 您是要复制列表还是列表中的对象?请编辑您的问题以澄清。
  • 你在用克隆做什么?

标签: c#


【解决方案1】:

这完全取决于您打算如何使用副本。

如果你做一个浅拷贝,比如

List<int> x = new List<int>() { 1, 2, 3, 4, 5 };
List<int> y = x;
y[2] = 4;

那么 x 将包含 {1, 2, 4, 4, 5 }

如果你对列表进行深拷贝:

List<int> x = new List<int> { 1, 2, 3, 4, 5 };
List<int> y = new List<int>(x);
y[2] = 4;

那么 x 将包含 { 1, 2, 3, 4, 5 } 并且 y 将包含 { 1, 2, 4, 4, 5 }

您计划如何使用副本确实决定了您使用浅副本还是深副本。

【讨论】:

    【解决方案2】:

    如果你有List&lt;int&gt; originalList = new List{1, 2} 然后这样做:
    List<int> newList = new List<int>();
    foreach(int i in originalList)
    newList.Add(i);

    会给你一个克隆列表。

    但是,如果您尝试了我在上面对某个引用类型使用 List 泛型所做的操作,那么您将不会成功。更改列表中的一个对象后,无论是从原始列表还是新列表中引用它,您都会看到更改后的版本。

    【讨论】:

      【解决方案3】:

      简短的回答,是的。

      长答案,您需要确定您的案例中的副本相对于列表的实际含义。您是否还需要列表内容的副本?对于像 int 这样的值类型,它非常简单,但如果它是引用类型....关于您希望列表包含的内容,您有一些问题要问。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多