У меня что-то похожее на это:
// 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 ответов
Да, но ничего не клонировано. Перед назначением один и тот же объект находится в обоих списках. После задания у вас есть два уникальных объекта в двух списках.
Сделай это:
list1[indexOfSomething].name = "SomeOtherName";
И объект в list2
тоже изменится.
// 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
должно быть правдой. Указатели качаются!
Вы не клонируете объект; вы добавляете ссылку на один и тот же объект в два списка. Однако ваш код заменяет ссылку в одном из списков ссылкой на другой объект, так что да, это ожидаемое поведение.
Вы заменяете ссылку в одном списке ссылкой на новый объект. Если бы вместо этого вы изменили свойство этого объекта, вы бы увидели, что оно изменилось в обоих местах, поскольку ссылка останется прежней.
Да, вы не клонируете объект. Первоначально объект добавляется в оба списка по ссылке, а затем вам назначается ссылка в списке на новый объект, который вы создаете.
Это, безусловно, ожидаемый результат.
Когда вы передаете объект «что-то» в Add, вы передаете его по значению (по умолчанию в C #), а не по ссылке.
Да, это ожидается. Добавляется только ссылка на объект. Не сама ссылка и не копия.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.