Когда вызывается статический конструктор в C#?
Когда у меня есть класс, содержащий статический конструктор, вызывается ли этот конструктор, когда сборка, содержащая класс, загружается впервые или когда удаляется первая ссылка на этот класс?
5 ответов
Когда к классу обращаются в первый раз.
Статические конструкторы (Руководство по программированию в C#)
Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз. Он вызывается автоматически перед созданием первого экземпляра или ссылками на любые статические элементы.
Это не так просто, как можно было бы ожидать, несмотря на простую документацию. Статья Джона Скита http://csharpindepth.com/Articles/General/Beforefieldinit.aspx подробно описывает этот вопрос.
Резюме:
Статический конструктор гарантированно будет выполнен непосредственно перед первой ссылкой на член этого класса - либо создание экземпляра, либо собственный статический метод / свойство класса.
Обратите внимание, что статические инициализаторы (если нет статического конструктора) гарантированно будут выполняться в любое время до первой ссылки на конкретное поле.
Статический конструктор вызывается до того, как вы что-либо используете в классе, но когда это происходит, зависит от реализации.
Он гарантированно вызывается до доступа к первому статическому члену и до создания первого экземпляра. Если класс никогда не используется, статический конструктор не гарантированно вызывается вообще.
В случае, если статический метод вызывается из родительского класса, статический конструктор не будет вызываться, хотя он явно указан. Вот пример, конструктор b не вызывается, если вызывается b.methoda().
static void Main(string[] args)
{
b.methoda();
}
class a
{
public static void methoda()
{
//using initialized method data
}
}
class b : a
{
static b()
{
//some initialization
}
}
Кажется, что есть недочет со статическими конструкторами, на который есть ответы в другом месте, но потребовалось некоторое время, чтобы разобраться в простом объяснении. Во всех документах и пояснениях утверждается, что статический конструктор / инициализаторы "гарантированно" будет запущен до создания первого класса или ссылки на первое статическое поле. Гоча появляется, когда вы пытаетесь поместить статический синглтон в класс, который создает свой экземпляр (курица / яйцо). В этом случае статический конструктор вызывается после конструктора экземпляра - и в моем случае конструктор экземпляра содержал код, который полагался на некоторые статические данные.
Статический конструктор вызывается после конструктора экземпляра?
Статический конструктор может запускаться после нестатического конструктора. Это ошибка компилятора?
(ответом для меня было поместить синглтон в отдельный класс или вручную инициализировать статические данные в конструкторе экземпляра до того, как это потребуется)