静态变量初始化

Azo*_*ous 29 c# static initialization

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

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

sra*_*sra 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(){}
}
Run Code Online (Sandbox Code Playgroud)

4.静态构造函数很慢

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

  • 类的静态构造函数在创建类的任何实例之前执行.
  • 类的静态构造函数在
    引用该类的任何静态成员之前执行.
  • 类的静态构造函数在类的静态字段初始化程序(如果有)之后执行.
  • 在单个程序实例化期间,类的静态构造函数最多执行一次.

  • 未指定两个不同类的两个静态构造函数之间的执行顺序.


jay*_*yco 6

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

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

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

  • 呃,不。Re“编译器会在调用类的任何方法的任何地方注入代码,以检查静态构造函数是否已被调用。” 你这已经是乱码了。唯一完成的注入是在 **static** 成员上,以确保静态初始化程序首先运行。AFAIK 检查并不比测试 null 更糟糕。我从未遇到过这会对性能产生重大影响的情况。绝大多数成员访问是*实例*而不是*静态*。 (3认同)