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

时间:2011-09-19 10:27:53

标签: c# .net clr

我想是的!

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

2 个答案:

答案 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)

您唯一的保证如下:

  • 在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。
  • 用户无法控制程序中何时执行静态构造函数。