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

标签 c# .net clr

大概吧!

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

最佳答案

抖动的内联策略是一个实现细节-随时可能更改-因此几乎不能保证内联什么或不能内联。

话虽这么说,但要牢记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/

相关文章:

c# - 针对 x86 和 x64 的设置?

c# - Linq to Xml 转换列表

c# - 以方法作为参数调用基础构造函数

.net - CLR:所有线程如何共享第 0 代?

c# - 为什么 CLR 会重新抛出 ThreadAbortException?

c# - 如何通过单击 ASP.NET gridview 中一行中的按钮获取行数据

c# - 我可以在 Entity Framework 中默认获得自定义排序的 EntityCollection 吗?

c# - 如何制作代码片段并将其添加到 Visual Studio 中的 Snippet intellisense?

c# - 将 .NET 应用程序转换为 x86 native 代码

.net - Portable Library .Net 中的 Sha256 哈希