【发布时间】: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