C#中的外部静态构造函数目的是什么?

12
根据"C#语言规范5.0版"的"10.12静态构造函数"部分,静态构造函数可以标记为"extern"修饰符,这种情况下它被称为外部静态构造函数
普通(非外部)静态构造函数是众所周知的。它们用于初始化静态字段和属性。
外部静态方法经常用于通过P/Invoke调用本地函数。
我也知道相当神秘的extern构造函数(另请参见此问题)。例如,String类有几个这样的声明,这些构造函数由运行时实现。

但是外部静态构造函数有什么真正的用途吗?我在coreclr repo中搜索了一下,但没有找到任何相关内容。语言规范也无法对从未在实际应用中使用过的某些构造进行描述。或者可能存在使用它们的情况吗?

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


我认为你会在第10节的每个小节中找到非常相似的文本块,从10.6(方法)到10.13(析构函数)。如果没有其他的,至少它是一致的 - Damien_The_Unbeliever
1
extern 唯一的作用就是将方法的 RVA 设置为 0。运行时会自行解决其余问题。参见 https://dev59.com/tloT5IYBdhLWcg3w8S61/ 。语言规范很少禁止这样做,因为编译器的工作非常简单(禁止它反而更费力)。此外,由于构造函数不能标记为 DllImport,因此实现此类方法的唯一方法是使用 MethodImplOptions.InternalCall,因此运行时是唯一可能的消费者,使得明确禁止它变得更加无趣。 - Jeroen Mostert
至于为什么它们实际上没有被使用,那就属于推测的范畴,但如果我是CLR实现者,我会强烈倾向于在易于预测的位置进行静态初始化,而不是依赖于静态类型初始化的相当神秘的规则。所有这些代码都会回调到运行时,因此这只会让我的工作更加困难。 - Jeroen Mostert
这个问题看起来是关于C#构造函数extern修饰符的用途的。 - Hans
1
@JacobKrall 这不是重复的问题。你提到的问题是关于extern构造函数的。我明确提到我知道它们的目的。但我的问题是关于extern static构造函数的。我没有找到它们的任何用法,这就是为什么我问这个问题的原因。 - Andrew Karpov
@AndrewKarpov:撤回;对混淆感到抱歉! - Jacob Krall
1个回答

1

来自 MSDN:

当构造函数声明包含 extern 修饰符时,该构造函数被称为外部构造函数。因为外部构造函数声明不提供实际的实现,所以它的构造函数体由一个分号组成。

...

看起来我们无法想到使用此声明的好理由,但它确实是正确的。 但是,当您进一步挖掘时,您会意识到有一个完整的动态组装或 - 代码生成 的世界。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接