【问题标题】:What is the purpose of external static constructors in C#?C# 中外部静态构造函数的目的是什么?
【发布时间】:2017-07-04 16:07:21
【问题描述】:

根据“C# 语言规范。版本 5.0”的“10.12 静态构造函数”部分,静态构造函数可以用“extern”修饰符标记,在这种情况下,它被称为 外部静态构造函数 .

普通(非外部)静态构造函数是众所周知的。它们用于初始化静态字段和属性。

外部静态方法通常用于通过 P/Invoke 调用原生函数。

而且我也知道非常深奥的 extern 构造函数(另请参阅this question)。比如String类有几个这样的declarations,这些构造函数都是运行时实现的。

但是外部静态构造函数有真正的用途吗?我搜索了coreclr repo,一无所获。语言规范无法描述一些从未在野外使用过的构造。或者可以吗?

我的猜测:C# 有外部静态构造函数只是因为 CLR 支持它们(原则上)。

【问题讨论】:

  • 我想你会在第 10 节的每个小节中找到非常相似的文本块,从 10.6(方法)到 10.13(析构函数)。如果不出意外,至少它是一致的
  • extern 唯一要做的就是将方法的 RVA 设置为 0。剩下的由运行时计算。另见stackoverflow.com/q/38015024。语言规范几乎没有理由禁止这样做,因为编译器的工作是微不足道的(取缔它会做更多的工作)。此外,由于不能将构造函数标记为DllImport,因此实现此类方法的唯一方法是使用MethodImplOptions.InternalCall,因此运行时是唯一可能的消费者,因此显式禁止它变得更没意思了。
  • 至于为什么没有实际使用它们,这属于推测领域,但如果我是 CLR 实现者,我强烈希望在易于预测的位置进行静态初始化,而不是而不是依靠相当神秘的规则来初始化静态类型。无论如何,所有这些代码都会回调到运行时,所以它只会让我的工作更加困难。
  • @JacobKrall 这不是重复的。您提到的问题是关于 extern 构造函数。我明确提到我知道他们的目的。但我的问题是关于 extern static 构造函数。我没有发现它们的任何用法,这就是我问这个问题的原因。

标签: c# constructor static extern language-specifications


【解决方案1】:

来自 MSDN:

当构造函数声明包含 extern 修饰符时, 构造函数被称为外部构造函数。因为一个外部 构造函数声明没有提供实际的实现,它的 constructor-body 由分号组成。

...

似乎我们想不出使用此声明的充分理由,而且它肯定是正确的。 但是,当您进一步挖掘时,您会发现整个世界都是动态组装或 - 代码生成。

如果您要为 .NET 平台开发编译器,您可能需要像 C# 编译器使用的一些诡计解决方案。我可以意识到,一些核心实现使用外部构造函数,这是出于良好的设计原因而在其他地方实现的。

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 2013-12-25
    • 2011-07-15
    • 2011-05-06
    • 2011-10-23
    • 1970-01-01
    • 2011-03-12
    • 2011-05-29
    • 2011-09-24
    相关资源
    最近更新 更多