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

Инициализация статических переменных

Сегодня у меня была дискуссия с моим коллегой и были следующие пункты. Пожалуйста, бросьте какой-то свет, если все правильно, или требуется какая-то модификация.

  • Когда статический конструктор не определен в классе, статические поля инициализируются непосредственно перед их использованием.
  • Когда статический конструктор определен в классе, статические поля инициализируются непосредственно перед их использованием или как часть создания экземпляра (до).
  • Если статическое поле не доступно в статическом методе и что статический метод вызывается. статические поля будут инициализированы только в том случае, если в этом классе определен статический конструктор.
  • Если возможный статический конструктор следует избегать в классе.
4b9b3361

Ответ 1

1. -3. Вы не можете точно знать, когда это произойдет, и поэтому вы не можете зависеть от этого. Статический конструктор даст вам небольшой контроль над тем, что происходит при вызове.

public class UtilityClass
{
  //
  // Resources
  //

  // r1 will be initialized by the static constructor
  static Resource1 r1 = null;

  // r2 will be initialized first, as static constructors are 
  // invoked after the static variables are initialized
  static Resource2 r2 = new Resource2();

  static UtilityClass()
  {
    r1 = new Resource1();
  }

  static void f1(){}
  static void f2(){}
}

4. Статические конструкторы работают медленно

Точное время выполнения статического конструктора зависит от реализации, но подчиняется следующим правилам:

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

Ответ 2

Все ваши вопросы верны.

Причина, по которой следует избегать статических конструкторов, заключается в том, что компилятор вводит код везде, где вызывается какой-либо метод класса, чтобы проверить, вызван ли статический конструктор. Это негативно сказывается на производительности.

Что вы можете сделать, так это иметь частное статическое поле в вашем классе, которому присваивается фиктивное значение при вызове конструктора по умолчанию (или другого нестатического). Это инициализирует все статические поля при создании объекта.