gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:15:18 24 4
gpt4 key购买 nike

大概吧!

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

最佳答案

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com