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

本文关键字:静态 构造函数 运行 何时 何知道 | 更新日期: 2023-09-27 18:24:56

我不相信生成的代码会在每次访问静态成员(包括函数)时检查类是否已初始化。我认为检查每个访问都是低效的。我看了ECMA334中的§17.11,上面写着

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

  • 将创建该类的实例
  • 类的任何静态成员都被引用

似乎没有定义如何确定"第一次"发生的时间。我想不出任何办法,只能每次都检查一下。如何做到这一点?

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

当你有一个问题要解决时,一个好的技巧是:解决一个更难的问题,这样你的小问题的解决方案就被更难的解决方案所解决。

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

也许你的问题应该是"抖动如何知道何时第一次jit方法?"

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