静态变量初始化

时间:2011-05-10 12:18:19

标签: c# static initialization

今天我与同事讨论并得出以下几点。如果一切正确或需要进行一些修改,请注意点亮。

  1. 当静态构造函数未在类中定义时,静态字段在使用之前就已初始化。
  2. 当在类中定义静态构造函数时,静态字段在使用之前或作为(之前)实例创建的一部分进行初始化。
  3. 如果在静态方法中没有访问静态字段,则调用静态方法。只有在该类中定义了静态构造函数时,才会初始化静态字段。
  4. 如果可能的话,应该避免在类中使用静态构造函数。

2 个答案:

答案 0 :(得分:10)

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.静态构造函数很慢

静态构造函数执行的确切时间取决于实现,但遵循以下规则:

  • 类的静态构造函数 在任何实例之前执行 创建了一个类。
  • 类的静态构造函数 在任何静态之前执行 班级成员是
    引用。
  • 类的静态构造函数 在类的静态字段初始值设定项(如果有)之后执行。
  • 类的静态构造函数 最多只执行一次 单个程序实例化。
  • 两者之间的执行顺序 两个静态构造函数 没有指定不同的类。

答案 1 :(得分:4)

你的所有观点都是正确的。

应避免使用静态构造函数的原因是因为编译器会在调用类的任何方法的任何地方注入代码,以检查是否已调用静态构造函数。这会对性能产生负面影响。

你可以做的是在你的类中有一个私有静态字段,当调用默认(或其他非静态)构造函数时,该字段被赋予一个虚拟值。这将初始化对象创建时的所有静态字段。