инициализация статических переменных - PullRequest
29 голосов
/ 10 мая 2011

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

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

Ответы [ 2 ]

10 голосов
/ 10 мая 2011

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.Статические конструкторы работают медленно

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

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

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

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

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

...