C#如何知道何时运行静态构造函数?

时间:2012-02-17 21:25:41

标签: c# .net static-constructor

我不相信生成的代码会在每次访问静态成员(包括函数)时检查是否已初始化类。我相信检查每次访问都是低效的。我查看了ECMA 334中的§17.11,并说它

  

静态构造函数的执行由第一个触发   应用程序域中发生以下事件:

     
      
  • 创建了一个类的实例。
  •   
  • 引用该类的任何静态成员。
  •   

看起来如何找出“第一次”发生的时间未定义。我想不出有任何办法,只能每次检查。怎么可能呢?

2 个答案:

答案 0 :(得分:16)

当你有一个问题要解决时,一个好的技巧是:解决一个更难的问题,这样就可以通过解决更难的问题解决你的小问题。

CLR有一个更难解决的问题:它必须在第一次调用方法之前在每个方法上运行一次抖动。如果CLR可以解决这个问题,那么它显然可以解决检测静态ctor何时需要运行的相对微不足道的子问题。

也许你的问题应该是“抖动如何知道何时首次使用方法?”

答案 1 :(得分:5)

在运行时生成代码时,您有很多选择。您可以调用NULL函数指针,捕获访问冲突,运行静态构造函数,编译属性getter,更新函数指针,然后继续。或者让属性getter调用一个运行静态构造函数的辅助函数,并在没有辅助函数调用的情况下重写getter代码。或者在每个静态成员访问时插入一个检查,当命中时重新编译调用函数并删除检查。