С#: При добавлении одного и того же объекта к двум переменным List <object>, является ли объект клонированным в этом процессе?

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

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

И объект в списке2 не изменяется... Это ожидаемый результат?

Ответы

Ответ 1

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

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

list1[indexOfSomething].name = "SomeOtherName";

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

Ответ 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);

Помните, что когда вы добавляете объект в список, вы просто добавляете указатель на объект. В этом случае 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 должно быть правдой. Указатели рок!

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Когда вы передаете объект "что-то" в "Добавить", вы проходите по значению (С# по умолчанию), а не по ссылке

Ответ 7

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