Я пытаюсь проверить свое понимание того, как С#/. NET/CLR обрабатывает типы значений и ссылочные типы. Я читал так много противоречащих объяснений, что я
Вот что я понимаю сегодня, пожалуйста, поправьте меня, если мои предположения ошибочны.
Типы значений, такие как int и т.д., находятся в стеке, типы ссылок живут в управляемой куче однако, если ссылочный тип имеет, например, переменную экземпляра типа double, она будет жить вместе с ее объект в куче
Вторая часть - это то, что меня больше всего смущает.
Давайте рассмотрим простой класс Person.
У человека есть свойство Name.
Предположим, что я создаю экземпляр Person в другом классе, мы будем называть его UnelessUtilityClass.
Рассмотрим следующий код:
class UselessUtilityClass
{
void AppendWithUnderScore(Person p)
{
p.Name = p.Name + "_";
}
}
а затем где-то мы делаем:
Person p = new Person();
p.Name = "Priest";
UselessUtilityClass u = new UselessUtilityClass();
u.AppendWithUnderScore(p);
Лицо является ссылочным типом при передаче в UselessUtilityClass - это то, куда я иду - орехи... VARIABLE p, который является экземпляром ссылки Person, передается VALUE, что означает, что когда я пишу p.Name, я увижу "Priest _"
И если я написал
Person p2 = p;
И я делаю
p2.Name = "Не священник";
И напишите имя p, как показано ниже. Я получу "Не жреца"
Console.WriteLine(p.Name) // will print "Not a Priest"
Это потому, что они являются ссылочными типами и указывают на один и тот же адрес в памяти.
Правильно ли я понимаю?
Я думаю, что есть некоторые недоразумения, когда люди говорят, что Все объекты в .NET переданы по ссылке, это не джив, основанный на том, что я думаю. Я мог ошибаться, вот почему я пришел к Штабелерам.