这两个构造函数都做同样的事情吗?

Per*_*kie 4 c# static-constructor

这两个代码块都做同样的事情吗?

class A {
   public static int s;
   A(){}
   static A(){s = 100;}
}
Run Code Online (Sandbox Code Playgroud)

class A {
   public static int s=100;
   A(){}
   //static A(){s = 100;} do not use
}
Run Code Online (Sandbox Code Playgroud)

他们做同样的事情吗?我认同.

Jon*_*eet 11

不,他们的行为方式不一样.如果没有静态构造函数,那么类型初始化程序执行时的确切时间会更加宽松 - 它可能比您预期的更早或更晚发生.

当存在静态构造函数时,类型初始化程序在首次使用类型时执行任何正在访问的静态成员或正在创建的任何实例.

没有静态构造函数时,唯一的保证是初始化程序将在第一次访问静态字段之前的某个时刻执行(并且仍然只有一次).取决于JIT,这可能意味着它很早就执行(例如,当您第一次执行可能使用成员的方法时)或非常晚(调用不使用任何字段的静态成员之后,或者在创建和使用实例之后) .

在IL中,区别在于没有静态构造函数的类型具有beforefieldinit标志; 一个静态构造函数没有.