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

// 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 не изменился ... Это ожидаемый результат?

16
Austin Hanson 5 Июн 2009 в 22:13

7 ответов

Лучший ответ

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

Сделай это:

list1[indexOfSomething].name = "SomeOtherName";

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

23
Can Berk Güder 5 Июн 2009 в 18:16
// 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 должно быть правдой. Указатели качаются!

6
Juliet 5 Июн 2009 в 18:20

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

4
Fredrik Mörk 5 Июн 2009 в 18:15

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

4
Jon B 5 Июн 2009 в 18:18

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

Это, безусловно, ожидаемый результат.

3
Joseph 5 Июн 2009 в 18:15

Когда вы передаете объект «что-то» в Add, вы передаете его по значению (по умолчанию в C #), а не по ссылке.

1
Jon Erickson 5 Июн 2009 в 18:18

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

0
JaredPar 5 Июн 2009 в 18:16