我不相信生成的代码会在每次访问静态成员(包括函数)时都检查类是否已初始化。我认为每次访问都进行检查效率很低。我查看了 ECMA 334 中的 §17.11,它说:
触发静态构造函数执行的第一个应用程序域内事件是以下事件中的任意一个:
- 创建类的实例。
- 引用该类的任何静态成员。
看起来如何确定何时发生“第一次”并未定义。我无法想到任何方法,只能每次都进行检查。有什么方法可以解决这个问题?
我不相信生成的代码会在每次访问静态成员(包括函数)时都检查类是否已初始化。我认为每次访问都进行检查效率很低。我查看了 ECMA 334 中的 §17.11,它说:
触发静态构造函数执行的第一个应用程序域内事件是以下事件中的任意一个:
- 创建类的实例。
- 引用该类的任何静态成员。
看起来如何确定何时发生“第一次”并未定义。我无法想到任何方法,只能每次都进行检查。有什么方法可以解决这个问题?
当你需要解决一个问题时,一个好的技巧是:解决一个更难的问题,这样你小问题的解决方案就可以通过解决更难的问题来解决。
CLR需要解决一个更加困难的问题:在每次第一次调用方法之前,必须精确地运行Jitter。如果CLR能够解决这个问题,那么它显然可以解决检测静态构造函数何时需要运行的相对较简单的子问题。
也许你的问题应该是“Jitter如何知道何时为方法进行JIT编译?”
当您在运行时生成代码时,有很多选项。您可以调用一个空的函数指针,捕获访问冲突,运行静态构造函数,编译属性获取器,更新函数指针并继续执行。或者让属性获取器调用一个帮助函数来运行静态构造函数,并重新编写获取器代码,不再需要帮助函数调用。或在每次访问静态成员时插入检查点,如果命中,则重新编译调用函数并删除检查点。