Подтвердить что ты не робот

Какова функция статического конструктора в нестационарном классе?

Я заметил, что нестатический класс может иметь статический конструктор:

public class Thing
{
    public Thing()
    {
        Console.WriteLine("non-static");
    }

    static Thing()
    {
        Console.WriteLine("static");
    }
}

И когда вы инициализируете экземпляр Thing, сначала ставится конструктор static.

Вывод:

статическая

нестатический

Для чего это понадобится? Используете ли вы его для инициализации статических полей в экземпляре нестатического типа?

Есть ли какие-либо вещи, которые нужно учитывать при использовании статического конструктора?

4b9b3361

Ответ 1

Используете ли вы его для инициализации статических полей в экземпляре нестатического типа?

В значительной степени, за исключением того, что статические поля (или статические члены любого типа) не связаны с экземплярами; они связаны с самим типом, независимо от того, является ли он статическим классом или нестационарным классом.

В документации перечислены некоторые свойства статических конструкторов, один из которых:

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

Здесь "before" означает "непосредственно перед", и в зависимости от того, что происходит в первую очередь. Это связано с тем, что статический конструктор вызывается только один раз для каждого типа при выполнении одной программы.


Есть ли какие-либо вещи, которые нужно учитывать при использовании статического конструктора?

Здесь полный список, указанный в приведенной выше ссылке, который должен дать вам представление о том, чего ожидать при использовании статического конструктора:

  • Статический конструктор не принимает модификаторы доступа или не имеет параметров.

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

  • Статический конструктор нельзя вызвать напрямую.

  • Пользователь не может контролировать, когда статический конструктор выполняется в программе.

  • Типичное использование статических конструкторов - это когда класс использует файл журнала, а конструктор используется для записи записей в этот файл.

  • Статические конструкторы также полезны при создании классов-оболочек для неуправляемого кода, когда конструктор может вызвать метод LoadLibrary.

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

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

Ответ 2

Из MSDN Ссылка:

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

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

Ответ 3

Вы используете его для инициализации или вызова статических членов вашего класса.

Ответ 4

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

Ответ 5

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

Ответ 6

Как указано BoltClock a Unicorn выше.

Но приятным дополнением является то, что вы можете использовать его для реализации синглтона и легко и легко:

public sealed class Singleton
{
   private static readonly Singleton instance;

   private Singleton() { }

   static Singleton()
   {
      instance = new Singleton()
   }

   public static Singleton Instance
   {
      get 
      {
         return instance; 
      }
   }
}

Более подробную информацию можно найти на http://www.codeproject.com/Articles/90896/Singletons-in-C-Static-Constructor-vs-Static-Initi