这两个代码块都做同样的事情吗?
class A {
public static int s;
A(){}
static A(){s = 100;}
}
和
class A {
public static int s=100;
A(){}
//static A(){s = 100;} do not use
}
他们做同样的事情吗?我想是这样。
不,它们的行为方式不尽相同。如果没有静态构造函数,则类型初始化程序执行的确切时间要宽松得多-它可能比您期望的更早或更晚发生。
如果有静态构造函数,则在首次使用该类型(根据要访问的任何静态成员或所创建的实例)时,将执行类型初始化器。
当没有静态构造函数时,唯一的保证是初始化程序将在首次访问静态字段之前(并且仍然是一次)执行。取决于JIT,这可能意味着它执行得很早(例如,当您首次执行可能使用成员的方法时)或执行得很晚(在调用不使用任何字段的静态成员之后,或者在创建和使用实例之后)执行。
在IL中,区别在于没有静态构造函数的类型具有beforefieldinit
标志;一个带有静态构造函数的没有。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句