Що робить прапор beforefieldinit? Коли я заглядаю в ІЛ свого класу, то бачу цей прапор, але не знаю, що насправді робить цей прапор?
Що робить прапор beforefieldinit? Коли я заглядаю в ІЛ свого класу, то бачу цей прапор, але не знаю, що насправді робить цей прапор?
Відповіді:
Дивіться мою статтю саме з цього питання.
По суті, beforefieldinit
означає "тип може бути ініціалізований у будь-який момент до посилання на будь-які статичні поля". Теоретично це означає, що його можна дуже лінько ініціалізувати - якщо ви викликаєте статичний метод, який не торкається жодного поля, JIT не потрібно ініціалізувати тип.
На практиці це означає, що клас ініціалізується раніше, ніж це було б інакше - це нормально, якщо він ініціалізується на початку першого методу, який міг би його використовувати. Порівняйте це з типами , які НЕ були beforefieldinit
застосовані до них, коли ініціалізації типу повинна відбуватися безпосередньо перед першим фактичним використанням.
Отже, припустимо, що ми маємо:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Якщо обидва типи beforefieldinit
застосували до них (що в C # вони роблять за замовчуванням, якщо тип не має статичного конструктора), тоді обидва вони будуть ініціалізовані на початку DoSomething
методу (зазвичай - це не гарантовано). Якщо їх немає, beforefieldinit
тоді буде ініціалізовано лише один із них на основі прапора.
Ось чому зазвичай застосовується статичний конструктор (навіть порожній!) При реалізації шаблону singleton .
Схоже, це зміниться в 4.6
beforefieldinit
чи ні)?