2016-08-15 2 views
-1

Выполнено много запросов, но ни один из них не уточнил мои сомнения.Как C# обрабатывает память для статических элементов

Когда вы используете статический класс или метод, когда C# выделяет для них память? И вообще ли он освобождается?

Бонусный вопрос: когда следует использовать статический член или класс?

+0

При первом использовании этого класса. Он не освобождается. –

+0

На вопрос о бонусе: используйте статический член или класс, когда вам это нужно. –

+0

Он выделяет память во время компиляции, скорее всего. Но это действительно деталь реализации, а не то, о чем вам нужно беспокоиться. Какую проблему ты пытаешься решить? Почему это имеет значение? –

ответ

1

https://msdn.microsoft.com/en-us/library/79b3xss3.aspx

Как и в случае со всеми типами класса, информация типа для статического класса загружается .NET Framework общеязыковой среды выполнения (CLR), когда программа, которая ссылается на класс загружается. Программа не может точно указать, когда загружен класс. Тем не менее, он гарантированно будет загружен и инициализирован его поля, а его статический конструктор вызывается до того, как класс будет указан в первый раз в вашей программе. Статический конструктор вызывается только один раз, а статический класс остается в памяти для времени жизни домена приложения, в котором находится ваша программа.

2

Когда один использовать статический класс или метод, когда же с # выделяет память для них?

Это не C#, который выделяет память, это базовая CLR. Вы также должны различать распределение памяти и фактическое Инициализация членов.

память памяти может случиться, когда программа (EXE, DLL) загружена в память. Это связано с тем, что в «типичной» реализации статические данные хранятся на так называемом сегменте data. Это фиксированная часть памяти, предназначенная для хранения постоянных (с точки зрения времени выполнения) структур данных. Однако конкретная реализация может работать несколько иначе, хотя это должен быть какой-то статический сегмент data, по меньшей мере содержащий указатели на другие структуры данных.

Инициализация происходит до первого доступа к классу.

И вообще ли оно освобождается?

№. Они являются статическими.


Бонус вопрос: Когда следует использовать статический элемент или класс?

Боковое примечание. Это не бонусный вопрос, а причина для закрытия вопроса, в основном основанного на мнениях.

+0

Спасибо, Ондрей! Помог мне много. –