C#:将同一个对象添加到两个List <object>变量时,是否在过程中克隆了对象?</object>

时间:2009-06-05 18:13:04

标签: c# collections

我有类似的东西:

// Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();

...

SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);

...

list1[indexOfSomething] = new SomeType("SomeOtherName");

并且list2中的对象没有改变......这是预期的结果吗?

7 个答案:

答案 0 :(得分:21)

是的,但没有任何克隆。在分配之前,两个列表中都有相同的对象。分配后,您在两个列表中有两个唯一对象。

执行此操作:

list1[indexOfSomething].name = "SomeOtherName";

list2中的对象也会改变。

答案 1 :(得分:7)

// Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();

...

SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);

请记住,当您将对象添加到列表时,您实际上只是添加了一个指向该对象的指针。在这种情况下,list1和list2都指向内存中的相同地址。

list1[indexOfSomething] = new SomeType("SomeOtherName");

现在您已将元素list1分配给不同的指针。

你自己并没有真正地克隆对象,你正在复制恰好指向同一个对象的指针。如果您需要证明,请执行以下操作:

SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);

list1[someIndex].SomeProperty = "Kitty";

bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;

areEqual应该是真的。指针摇滚!

答案 2 :(得分:4)

你没有克隆对象;您正在添加对两个列表中的同一对象的引用。但是,您的代码使用对另一个对象的引用替换其中一个列表中的引用,所以是的,这是预期的行为。

答案 3 :(得分:4)

您将使用对新对象的引用替换一个列表中的引用。如果您改为更改该对象的属性,您会看到它在两个位置都发生了变化,因为引用将保持不变。

答案 4 :(得分:3)

是的,你没有克隆对象。该对象最初通过引用添加到两个列表中,然后您在列表中为您正在创建的新对象分配了一个引用。

这绝对是预期的结果。

答案 5 :(得分:1)

当你将'something'对象传递给Add时,你传递的是值(c#default),而不是通过引用传递

答案 6 :(得分:0)

是的,这是预期的。仅添加对象的引用。不是参考本身或副本。