我想是的!
编辑:这个问题的动机是:在我看来,由于静态构造函数的语义,它们永远不能安全地内联。
答案 0 :(得分:7)
抖动的内联策略是一个实现细节 - 随时可能发生变化 - 因此几乎无法保证内联可以或不可内联。
话虽如此,很难看出静态构造函数如何安全地内联,同时考虑到C#和CLI规范提供的有关静态构造函数和类型初始化的保证。
来自Microsoft C# specification(第10.12节):
封闭类类型的静态构造函数最多执行一次 在给定的应用程序域中。执行静态构造函数 是由以下事件中的第一个触发而发生的 应用领域:
- 创建了类类型的实例。
- 引用类类型的任何静态成员。
来自ECMA CLI specification(第8.9.5节):
[类可以]可选地指定一个方法(称为
.cctor
) 调用初始化类型。何时触发执行此类型的语义 初始化方法,如下:
- 类型可以使用类型初始化方法。
可以将类型指定为具有放松的语义 类型初始化方法(为方便起见,我们称之为放松 语义 BeforeFieldInit )。
如果标记为 BeforeFieldInit ,则类型的初始化方法为 在首次访问任何静态字段时或之前执行 为该类型定义。
如果未标记 BeforeFieldInit ,则表示该类型的初始化方法 执行于(即由...触发):
- 首先访问该类型的任何静态字段,或
- 首先调用该类型的任何静态方法,或
- 首先调用该类型的任何实例或虚方法if 它是值类型或
- 首先调用该类型的任何构造函数。
(请注意,带有静态构造函数的C#类不会具有beforefieldinit
语义。没有静态构造函数的C#类将具有beforefieldinit
语义。)
答案 1 :(得分:1)
您唯一的保证如下: