12

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

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

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

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

4

2 回答 2

17

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

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

也许您的问题应该是“抖动如何知道何时首次对方法进行抖动?”

于 2012-02-17T21:40:12.077 回答
5

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

于 2012-02-17T21:31:35.617 回答