【问题标题】:Explanation about the clone the array containing cloneable objects is needed关于克隆包含可克隆对象的数组的说明是必需的
【发布时间】:2014-07-17 09:19:42
【问题描述】:

我正在尝试以下代码:

public class cloneTest : ICloneable {

    public string strValue { get; set; }

    public object Clone( ) {
      cloneTest n = new cloneTest( );
      n.strValue = this.strValue;
      return n;     
    }
}

cloneTest obj1 = new cloneTest( ) { strValue = "one" };
cloneTest obj2 = new cloneTest( ) { strValue = "two" };
cloneTest obj3 = new cloneTest( ) { strValue = "three" };

cloneTest[ ] strValueArray = new cloneTest[  ] {obj1, obj2, obj3};

cloneTest[ ] strValueArrayClone = ( cloneTest[ ] )strValueArray.Clone( );
strValueArrayClone[ 2 ].strValue = "four";

当我按照我的代码中指定的方式修改 strValuArrayClone 对象时,此更改也会反映在 strValueArray 对象中,即使我正在创建克隆。但是,如果尝试下面的代码,那么一切都会顺利进行。我想了解它背后的逻辑。

cloneTest obj1 = new cloneTest( ) { strValue = "one" };
cloneTest obj2 = new cloneTest( ) { strValue = "two" };
cloneTest obj3 = new cloneTest( ) { strValue = "three" };

cloneTest[ ] strValueArray = new cloneTest[  ] {obj1, obj2, obj3};

cloneTest[ ] strValueArrayClone = ( cloneTest[ ] )strValueArray.Clone( );
cloneTest obj2clone = ( cloneTest )obj2.Clone( );
obj2clone.strValue = "six";
strValueArrayClone[ 2 ] = obj2clone;

【问题讨论】:

    标签: c# clone cloneable


    【解决方案1】:

    您正在创建一个数组的克隆,但内容相同。数组Clone() 方法是一个浅克隆。由于内容是 references,因此两个数组中的槽都引用了相同的实际 objects 实例。在第一个代码示例中,无论您创建多少个引用这 3 个实例的数组,都只有 3 个 cloneTest 实例。如果您更改这 3 个对象之一的属性,它将在所有引用该对象的地方可见 - 这意味着通过每个数组。

    选项:

    • 创建一个深度克隆(即在克隆数组时也克隆内部项目)
    • 在更改属性时克隆对象(这是您的第二个代码示例所做的)
      • 这种情况的一个特殊情况是使原始类型不可变,以防止此类事件发生

    【讨论】:

    • 感谢您的解释。我想了解,浅克隆有什么好处?
    • @User1551892 它为您提供了数组的隔离快照 - 在您开始交换引用等之前。请注意,对于值类型,这将是其内部值等的真正克隆,但它是几乎总是(即> 99%的时间)希望使结构不可变无论如何
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多