в С# статический конструктор запускается для каждой инициализации объекта или только один раз?

в моем классе у меня есть статический словарь объекта строк, который содержит большое количество элементов (он читает из файла и инициализирует их). Я написал для этого статический конструктор, и это занимает несколько секунд, но я хочу сделать это один раз чтобы быть быстрее, так как я делаю это в ASP.Net, и я хочу, чтобы мой веб-сайт не имел этих накладных расходов, что мне делать? если этот конструктор запускается для каждого объекта, то вместо этого я думал о каком-то методе, но я думаю, что мне нужно запускать этот метод на каждой странице веб-сайта, которую запускает пользователь, поэтому я снова думаю, что это будет то же самое, я прав? каково ваше решение для инициализации большого набора переменных только один раз? Спасибо


person ePezhman    schedule 14.08.2011    source источник


Ответы (2)


Он запускается один раз для типа на AppDomain. Не один раз за экземпляр. Из спецификации С# 4, раздел 10.12:

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

  • Создается экземпляр типа класса.
  • Ссылаются на любой из статических членов типа класса.

Обратите внимание на часть о том, что это относится к классу closed. Таким образом, если у вас есть общий тип Foo<T>, то Foo<string> является отдельным типом для Foo<object> (и т. д.), будет иметь отдельные статические поля и его статический конструктор будет вызываться отдельно.

person Jon Skeet    schedule 14.08.2011

Он запускается только один раз в течение всего срока службы приложения.

Из MSDN — статические конструкторы:

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

person Oded    schedule 14.08.2011