C#:将同一个对象添加到两个List 变量时,是否在过程中克隆了对象?
我有类似的东西:
// Declarations: List list1 = new List(); List list2 = new List(); ... SomeType something = new SomeType("SomeName"); list1.Add(something); list2.Add(something); ... list1[indexOfSomething] = new SomeType("SomeOtherName");
并且list2中的对象没有改变……这是预期的结果吗?
是的,但没有任何克隆。 在分配之前,两个列表中都有相同的对象。 赋值后,两个列表中有两个唯一对象。
做这个:
list1[indexOfSomething].name = "SomeOtherName";
而且list2
的对象也会改变。
// Declarations: List list1 = new List (); List list2 = new List (); ... SomeType something = new SomeType("SomeName"); list1.Add(something); list2.Add(something);
请记住,当您将对象添加到列表时,您实际上只是添加了一个指向该对象的指针。 在这种情况下,list1和list2都指向内存中的相同地址。
list1[indexOfSomething] = new SomeType("SomeOtherName");
现在,您已将元素list1分配给不同的指针。
你本不是真正克隆对象,你正在复制恰好指向同一个对象的指针。 如果您需要certificate,请执行以下操作:
SomeType something = new SomeType("SomeName"); list1.Add(something); list2.Add(something); list1[someIndex].SomeProperty = "Kitty"; bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;
areEqual
应该是真的。 指针摇滚!
你没有克隆对象; 您正在添加对两个列表中的同一对象的引用。 但是,您的代码使用对另一个对象的引用替换其中一个列表中的引用,所以是的,这是预期的行为。
您将使用对新对象的引用替换一个列表中的引用。 如果您改为更改该对象的属性,您会看到它在两个位置都发生了变化,因为引用将保持不变。
是的,你没有克隆对象。 最初通过引用将对象添加到两个列表中,然后在列表中为您创建的新对象分配一个引用。
这绝对是预期的结果。
当您将’something’对象传递给Add时,您将通过值(c#default)传递,而不是通过引用传递
是的,这是预期的。 仅添加对象的引用。 不是参考本身或副本。