C #: при добавлении одного и того же объекта в две переменные List <object>, объект клонируется в процессе? - PullRequest
15 голосов
/ 05 июня 2009

У меня есть что-то похожее на это:

// 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 ]

21 голосов
/ 05 июня 2009

Да, но ничего не клонировано. Перед назначением один и тот же объект находится в обоих списках. После назначения у вас есть два уникальных объекта в двух списках.

Сделайте это:

list1[indexOfSomething].name = "SomeOtherName";

и объект в list2 тоже изменится.

7 голосов
/ 05 июня 2009
// 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 должно быть правдой. Указатели рок!

4 голосов
/ 05 июня 2009

Вы заменяете ссылку в одном списке ссылкой на новый объект. Если бы вы вместо этого изменили свойство этого объекта, вы бы увидели, что оно изменилось в обоих местах, так как ссылка останется прежней.

4 голосов
/ 05 июня 2009

Вы не клонируете объект; Вы добавляете ссылку на один и тот же объект в двух списках. Однако ваш код заменяет ссылку в одном из списков ссылкой на другой объект, поэтому да, это ожидаемое поведение.

3 голосов
/ 05 июня 2009

Да, вы не клонируете объект. Первоначально объект добавляется в оба списка по ссылке, а затем в списке вам назначается ссылка на новый объект, который вы создаете.

Это определенно ожидаемый результат.

1 голос
/ 05 июня 2009

Когда вы передаете объект 'что-то' в Add, вы передаете по значению (c # default), а не по ссылке

0 голосов
/ 05 июня 2009

Да, это ожидается. Добавлена ​​только ссылка на объект. Не сама ссылка или копия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...