静态构造函数是否保证不被内联?

Pet*_*ery 1 .net c# clr

大概吧!

编辑:这个问题的动机是:在我看来,由于静态构造函数的语义,他们永远无法安全地内联.

Luk*_*keH 7

抖动内联策略是一个实现细节 - 随时可能发生变化 - 因此几乎无法保证内联可以或不可内联的内容.

话虽如此,很难看出静态构造函数如何安全地内联,同时考虑到C#和CLI规范提供的有关静态构造函数和类型初始化的保证.

Microsoft C#规范(第10.12节):

封闭类类型的静态构造函数在给定的应用程序域中最多执行一次.静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

  • 创建类类型的实例.
  • 引用类类型的任何静态成员.

并且从ECMA CLI规范(第8.9.5节):

[类可以]可选地指定.cctor要调用以初始化类型的方法(被调用).

何时触发执行此类型初始化方法的语义如下:

  • 类型可以具有类型初始化方法或不具有类型初始化方法.

可以将类型指定为其类型初始化方法具有宽松的语义(为方便起见,我们称之为松弛语义BeforeFieldInit).

如果标记为BeforeFieldInit,则类型的初始化方法在首次访问为该类型定义的任何静态字段时或之前执行.

如果没有标记为BeforeFieldInit,则执行该类型的初始化方法(即,由以下方式触发):

  • 首先访问该类型的任何静态字段,或
  • 首次调用该类型的任何静态方法,或
  • 首先调用该类型的任何实例或虚方法(如果它是值类型或)
  • 首次调用该类型的任何构造函数.

(请注意,带有静态构造函数的C#类具有beforefieldinit语义.没有静态构造函数的C#类将具有beforefieldinit语义.)