【问题标题】:How does C# know when to run a static constructor?C# 如何知道何时运行静态构造函数?
【发布时间】:2012-03-09 06:55:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 相关,对于静态情况:csharpindepth.com/Articles/General/Beforefieldinit.aspx - 这很重要
  • 不就是第一次调用后将函数指针设置到不同位置的问题吗?一开始它指向类加载器或其他什么,然后指向函数的主体......
  • @Marc:这讨论了在允许第一次访问静态成员之前调用静态构造函数时,而不是如何检测第一次访问。
  • @Ben - k;改写。不过,任何对这个领域感兴趣的人仍然可以从这篇文章中受益 - 所以把链接留在那里
  • 我认为“...由以下第一个触发...”是说如果这些事件中的任何一个发生,则调用静态构造函数。该文本可以更简洁 - 我认为它有点模棱两可。

标签: c# .net static-constructor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 有趣。我只是假设非嵌入式系统上的 JIT 只是立即运行所有内容并等待加载新的 dll。我假设嵌入系统使用提前复杂性。糟糕的假设,尤其是在大代码起作用时。 +1 的想法
    • @acidzombie24 实际上,一些嵌入式系统根本不 JIT/AOT - Micro Framework 是一个 IL 解释器(交叉手指,我还没有倒过来.. .)
    • 和一些像.Net Compact Framework JIT这样的系统只有基本的东西,例如。 get 属性是一个函数调用
    • 你还没有回答问题。
    猜你喜欢
    • 2017-01-14
    • 2011-05-28
    • 1970-01-01
    • 2010-11-19
    • 2011-10-07
    • 1970-01-01
    • 2011-04-19
    • 2011-10-17
    • 2022-07-07
    相关资源
    最近更新 更多