Независимо от того, возвращает ли метод что-либо, не имеет ничего общего с тем, что происходит внутри него.
Вы, похоже, не понимаете, что на самом деле означает присвоение.
Давайте начнем с самого начала.
var myList = new List<string>();
выделяет новый объект List<string>
в памяти и помещает ссылку на него в переменную myList
.
В настоящее время только один экземпляр List<string>
создан вашим кодомно вы можете хранить ссылки на него в разных местах.
var theSameList = myList;
var sameOldList = myList;
someObject.MyList = myList;
Прямо сейчас myList
, theSameList
, sameOldList
и someObject.MyList
(которые в свою очередь хранятся вприватное поле SomeObject
, автоматически сгенерированное компилятором) все ссылаются на один и тот же объект .
Посмотрите на них:
var bob = new Person();
var guyIMetInTheBar = bob;
alice.Daddy = bob;
harry.Uncle = bob;
itDepartment.Head = bob;
Есть только одинэкземпляр Person
и множество ссылок на него.
Вполне естественно, что если бы наш Боб вырос на год старше, каждый экземпляр Age
увеличился бы.
Это тот же объект.
Если город был переименован, можно ожидать, что все карты будут перепечатаны сts new name.
Вам кажется странным, что
эти изменения отражаются в том же классе, который назначил
- но подождите, изменения не отражены .Там нет копирования под капотом.Они просто там, потому что это один и тот же объект, и если вы измените его, откуда бы вы к нему не обращались, вы получите доступ к его текущему состоянию.
Так что не имеет значения , где вы добавляетеэлемент в списке: пока вы ссылаетесь на тот же список, вы увидите добавляемый элемент.
Что касается вашего второго примера, я вижу, что Джейсон уже предоставилВы с гораздо лучшим объяснением , чем я мог бы дать, поэтому я не буду вдаваться в подробности.
Будет достаточно, если я скажу:
- Строкинеизменяемый в .NET, вы не можете изменить экземпляр
string
по разным причинам. , даже если они были изменяемыми (например, List<T>
, чье внутреннее состояние можно изменить с помощью методов)во втором примере вы не меняете объект, вы меняете ссылку .
var goodGuy = jack;
alice.Lover = jack;
alice.Lover = mike;
Может ли alice
изменить настроение jack
плохим парнем?Конечно, нет.
Аналогично, изменение myObject.MyString
не влияет на локальную переменную myString
.Вы ничего не делаете с самой строкой (а на самом деле вы не можете).