С#: При добавлении одного и того же объекта к двум переменным 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
Да, что ожидается. Добавляется только ссылка на объект. Не ссылка сама или копия.