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)传递,而不是通过引用传递

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