2009-09-17 2 views

ответ

79

Когда класс открывается в первый раз.

Static Constructors (C# Programming Guide)

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

+0

Спасибо, это имеет смысл, когда я думаю об этом правильно! – Jason

+5

Интересно, что он говорит «до создания первого экземпляра или ссылки на любые статические члены». Там есть некоторая свобода в *, когда * на самом деле вызывается. –

+5

@TimBarrass из-за некоторых других требований спецификации оказывается, что «до» на самом деле «непосредственно перед» - см. Статью Джона Скита, указанную в другом ответе - http://stackoverflow.com/a/1437372/477420 –

34

Это не так просто, как вы могли ожидать, несмотря на простую документацию. Статья Джона Скита http://csharpindepth.com/Articles/General/Beforefieldinit.aspx подробно затрагивает этот вопрос.

Резюме:

Статический конструктор гарантированно будет выполнен сразу перед первой ссылкой на члена этого класса - либо создание экземпляра или собственного статического метода/свойства класса.

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

+0

+1. Побей меня, только только. ;) – AnthonyWJones

+0

Это очень интересное чтение, спасибо. – Jason

+0

Упомянутая статья теперь находится на сайте Джона Скита: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy

17

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

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

+2

Когда это произойдет * не является «до реализации», если эта реализация следует за спецификацией ECMA C#: «Выполнение статического конструктора запускается первым из следующих событий, которые происходят внутри домена приложения: [1] экземпляр класса создается. [2] Ссылка на любой из статических членов класса. " (Раздел 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH

+0

@Luke: «Точное время выполнения статического конструктора зависит от реализации» http://ondotnet.com/паб/а/DotNet/2003/07/07/staticxtor.html – Guffa

+2

@ Guffa: Это может быть интерпретация автора статьи, но вы не найдете эту формулировку в версиях Microsoft или ECMA/ISO спецификации C#. – LukeH

0

В случае, если статический метод вызывается из родительского класса, статический конструктор не будет вызываться, althogh явно указывается. Вот пример 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 
    } 
}  
Смежные вопросы