大概吧!
编辑:这个问题的动机是:在我看来,由于静态构造函数的语义,它们永远无法安全地内联。
最佳答案
抖动的内联策略是一个实现细节-随时可能更改-因此几乎不能保证内联什么或不能内联。
话虽这么说,但要牢记C#和CLI规范所提供的关于静态构造函数和类型初始化的保证,很难看到如何安全地内联静态构造函数。
从Microsoft C# specification(第10.12节):
封闭类类型的静态构造函数最多执行一次
在给定的应用程序域中。静态构造函数的执行
由以下事件中的第一个触发
应用领域:
将创建该类类型的实例。
引用了类类型的任何静态成员。
从ECMA CLI specification(第8.9.5节):
[一个类可以]可选地指定一个方法(称为.cctor
)
调用以初始化类型。
何时以及什么触发此类执行的语义
初始化方法如下:
类型可以具有类型初始化器方法,也可以不具有。
可以将类型指定为具有宽松语义的类型
类型初始化方法(为方便起见,我们称其为宽松
语义BeforeFieldInit)。
如果标记为BeforeFieldInit,则该类型的初始化方法为
在首次访问任何静态字段时或之前执行
为该类型定义。
如果未标记BeforeFieldInit,则该类型的初始化方法
在以下位置执行(即由触发):
首次访问该类型的任何静态字段,或者
首次调用该类型的任何静态方法,或者
首次调用该类型的任何实例或虚拟方法,如果
它是一个值类型或
首次调用该类型的任何构造函数。
(请注意,带有静态构造函数的C#类将不具有beforefieldinit
语义。没有静态构造函数的C#类将具有beforefieldinit
语义。)
关于c# - 是否保证静态构造函数不被内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469481/