knackCoder Ответов: 4

Когда именно происходит выделение памяти для статических элементов в C#? ; Это происходит до самого времени компиляции или в момент выполнения?


Выделение памяти для статических элементов в C#

Что я уже пробовал:

Выделение памяти для статических элементов в C#

PIEBALDconsult

И не забывай:
http://csharpindepth.com/Articles/General/BeforeFieldInit.aspx

4 Ответов

Рейтинг:
25

OriginalGriff

Выделение статических данных выполняется при первом использовании содержащего класса.


knackCoder

Публичный статический пустота главный()
{
Class1 obj = новый Class1(1,2);
инт вал = StaticClassName.StaticMethodname(объект);
}
Выше я изначально создал экземпляр объекта Class1, и память выделяется.
После этого я впервые вызвал статический метод; то есть вы хотите сказать, что когда я вызвал статический метод в тот момент, память была выделена для статического члена?

OriginalGriff

Нет-член не занимает памяти и не требует выделения.
Но когда вы впервые обращаетесь к статическому классу-через этот вызов члена-вызывается статический конструктор статического класса, и все статические выделения памяти для этого класса выполняются непосредственно перед вызовом конструктора.

knackCoder

Я полагаю, что ваш ответ " Нет " находится в контексте с примером, проиллюстрированным мной?.
Таким образом, для статического члена память выделяется только при первом обращении к нему?; и если я вызываю статический член, скажем, статический метод несколько раз, то статический конструктор вызывается каждый раз?

OriginalGriff

Нет, статические методы не занимают памяти - и все статическое выделение выполняется при первом обращении к классу. Таким образом, если вы вызываете статический метод класса, то все статические распределения полей выполняются, а затем вызывается статический конструктор (если таковой имеется). Наконец, выполняется метод, который вы изначально просили.

Попробуйте: поставьте какую-нибудь отладку.Запишите инструкции и следите за порядком, в котором все происходит.

Рейтинг:
1

CPallini

Возможно, вы найдете здесь какую-то информацию: Внутренние компоненты .NET Framework: как среда CLR создает объекты среды выполнения[^].


Рейтинг:
1

PeejayAdams

У Microsoft Документы [^]

Цитата:
Статические члены инициализируются перед первым обращением к статическому члену и перед вызовом статического конструктора, если таковой имеется.


Также стоит отметить, что это поведение CLR, а не что-то специфичное для C#.


Рейтинг:
0

knackCoder

Спасибо за ссылку. Я мог бы понять, что статические члены хранятся в самой куче, но все же мне не ясно время выделения памяти. Не могли бы вы поделиться более подробной информацией об этом?

F-ES Sitecore

Ответ на ваш вопрос находится в результатах этого поиска очень близко к вершине. Если бы вы приложили хотя бы немного усилий сами, а не ожидали, что люди будут кормить вас с ложечки, у вас уже был бы ответ.

Richard MacCutchan

Лол.