Я пытаюсь узнать, как C# управляет памятью. Я застрял на статических элементах, я читал многочисленные блоги и статьи по этому вопросу, но я не могу найти вполне удовлетворительный ответ.Где хранятся все статические элементы?
Давайте определим блок кода, чтобы найти ответ.
class myClass
{
static string myStr = "String Data";
static int myInt = 12;
}
Прежде чем вы, ребята, поделитесь своим ответом, позвольте мне поделиться своими выводами, которые я знаю об этой теме. Не стесняйтесь соглашаться или не соглашаться и помогать мне найти правильный ответ.
- Static предназначен для всей жизни.
- Статический ссылочный тип (myStr), будет включен в кучу, на всю жизнь.
- Статический тип значения (myInt), будет идти на стек, для жизни.
Что меня смущает, некоторые ответы, которые я нашел в Интернете, по этому вопросу.
Путаница Номер 1:
При запуске программы он загружает все связанные сборки в AppDomain. Когда сборка загружается, вызывается все статические конструкторы, включая статические поля. Они будут жить там, и единственный способ их разгрузить - выгрузить AppDomain.
В приведенных выше строках указано, что все статические элементы хранятся в AppDomain. Тогда почему все в Интернете говорят, что элементы «Статические» хранятся в куче/стеке?
Путаница Номер 2:
Каждая статическая переменная хранится в куче, независимо от того, является ли это объявленная внутри ссылочного типа или типа значения.
Если каждая статическая переменная хранится в куче. Тогда почему некоторые люди говорят, что статическая переменная типа значения хранится в стеке?
Пожалуйста, помогите соединить мои точки, чтобы понять управление памятью статических переменных в C#. Большое спасибо за ваше драгоценное время :)
Люди могут смутить себя, перетаскивая понятия «стопка» и «куча» в первую очередь. Эти понятия не полезны сами по себе, если все, о чем вы хотите знать, - это время жизни объекта или область декларации, которые являются гораздо более релевантными понятиями на C#. Сбор мусора означает, что в 95% случаев вам нужно только заботиться о том, жив или нет объект, а объект, на который ссылается поле 'static', жив до тех пор, пока загружается класс. (Что касается того, когда он создан, это более сложная тема.) Конечно, это не ответ. –
Потому что они ошибаются. Они знают, что переменные типа значения _local_ хранятся в стеке (когда на самом деле все локальные переменные хранятся в стеке. Путаница заключается в том, что для ссылочного типа переменная является ссылкой, а не объектом). Статические переменные похожи на члены объекта 'Type', а' Type' не является типом значения. (Конечно, в отличие от Java, у C# на самом деле нет типа 'Type', чтобы было понятнее, что каждый' Type' является _different_-типом и имеет разные члены) –
Random832
@ Random832: Не все локальные переменные находятся в стеке. Закрытые местные жители не находятся в стеке. Локали в блоках итератора не находятся в стеке. Локали в асинхронных методах не находятся в стеке. Зарегистрированные местные жители не находятся в стеке. Элитные местные жители не находятся в стеке. Не верьте, что местные жители идут в стек; это просто ложно. Местные жители называются locals *, потому что их имена имеют локальную область *, а не потому, что они хранятся в стеке. –