C#: When adding the same object to two List<object> variables, is the object cloned in the process?

风流意气都作罢 提交于 2019-12-18 18:54:04

问题


I have something similar to this:

// 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");

And the object in list2 isn't changed... Is that the expected result?


回答1:


Yes, but nothing's cloned. Before the assignment, the same object is in both lists. After the assignment, you have two unique objects in two lists.

Do This:

list1[indexOfSomething].name = "SomeOtherName";

and the object in list2 will change, too.




回答2:


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

...

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

Remember, when you add an object to a list, you're really just adding a pointer to the object. In this case, list1 and list2 both point to the same address in memory.

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

Now you've assigned the element list1 to a different pointer.

You're not really cloning objects themselves, you're copying the pointers which just happen to be pointing at the same object. If you need proof, do the following:

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

list1[someIndex].SomeProperty = "Kitty";

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

areEqual should be true. Pointers rock!




回答3:


You are not cloning the object; you are adding a reference to the same object in the two lists. However, your code replaces the reference in one of the lists with a reference to another object, so yes, this is the expected behaviour.




回答4:


You're replacing the reference in one list with a reference to a new object. If you were to instead change a property of that object, you would see it changed in both places, since the reference would remain the same.




回答5:


Yes, you're not cloning the object. The object is being added to both lists originally by reference, and then subsequently you're assigned a reference in the list to the new object you're creating.

That is definitely the expected result.




回答6:


When you pass the 'something' object to Add you are passing by value (c# default), not by reference




回答7:


Yes that is expected. Only the reference to the object is added. Not the reference itself or a copy.



来源:https://stackoverflow.com/questions/957287/c-when-adding-the-same-object-to-two-listobject-variables-is-the-object-clo

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!