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

Aus*_*son 15 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");
Run Code Online (Sandbox Code Playgroud)

并且list2中的对象不会更改...这是预期的结果吗?

Can*_*der 22

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

做这个:

list1[indexOfSomething].name = "SomeOtherName";
Run Code Online (Sandbox Code Playgroud)

并且对象list2也将改变.


Jul*_*iet 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);
Run Code Online (Sandbox Code Playgroud)

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

list1[indexOfSomething] = new SomeType("SomeOtherName");
Run Code Online (Sandbox Code Playgroud)

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

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

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

list1[someIndex].SomeProperty = "Kitty";

bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;
Run Code Online (Sandbox Code Playgroud)

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