в C # Статический конструктор выполняется для каждой инициализации объекта, или только один раз? - PullRequest
3 голосов
/ 14 августа 2011

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

Ответы [ 2 ]

16 голосов
/ 14 августа 2011

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

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

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

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

4 голосов
/ 14 августа 2011

Он запускается только один раз за время существования приложения.

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

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

...