Когда у меня есть класс, содержащий статический конструктор, вызывается ли этот конструктор при первой загрузке сборки, содержащей класс, или при попадании первой ссылки на этот класс?
Ответы:
Когда к классу обращаются впервые.
Статические конструкторы (Руководство по программированию на C #)
Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз. Он вызывается автоматически перед созданием первого экземпляра или перед ссылками на статические члены.
A static constructor is used to initialize any static data
Нет. Лучше использовать static initializer
для инициализации статического материала.
Это не так просто, как вы могли ожидать, несмотря на простую документацию. В статье Джона Скита 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
}
}
Кажется, есть проблема со статическими конструкторами, на которую ответят в другом месте, но потребовалось время, чтобы переварить простое объяснение. Во всех документах и пояснениях утверждается, что статический конструктор / инициализатор "гарантированно" запускается до создания экземпляра первого класса или ссылки на первое статическое поле. Проблема возникает, когда вы пытаетесь поместить статический синглтон в класс, который создает сам себя (курица / яйцо). В этом случае статический конструктор вызывается после конструктора экземпляра - и в моем случае конструктор экземпляра содержал код, который полагался на некоторые статические данные.
Статический конструктор вызывается после конструктора экземпляра?
Статический конструктор может запускаться после нестатического конструктора. Это ошибка компилятора?
(ответом для меня было поместить синглтон в отдельный класс или вручную инициализировать статические данные в конструкторе экземпляра до того, как это потребуется)