根据"C#语言规范5.0版"的"10.12静态构造函数"部分,静态构造函数可以标记为"extern"修饰符,这种情况下它被称为外部静态构造函数。
普通(非外部)静态构造函数是众所周知的。它们用于初始化静态字段和属性。
外部静态方法经常用于通过P/Invoke调用本地函数。
我也知道相当神秘的extern构造函数(另请参见此问题)。例如,
普通(非外部)静态构造函数是众所周知的。它们用于初始化静态字段和属性。
外部静态方法经常用于通过P/Invoke调用本地函数。
我也知道相当神秘的extern构造函数(另请参见此问题)。例如,
String
类有几个这样的声明,这些构造函数由运行时实现。
但是外部静态构造函数有什么真正的用途吗?我在coreclr repo中搜索了一下,但没有找到任何相关内容。语言规范也无法对从未在实际应用中使用过的某些构造进行描述。或者可能存在使用它们的情况吗?
我的猜测是:C#之所以有外部静态构造函数,只是因为CLR原则上支持它们。
extern
唯一的作用就是将方法的 RVA 设置为 0。运行时会自行解决其余问题。参见 https://dev59.com/tloT5IYBdhLWcg3w8S61/ 。语言规范很少禁止这样做,因为编译器的工作非常简单(禁止它反而更费力)。此外,由于构造函数不能标记为DllImport
,因此实现此类方法的唯一方法是使用MethodImplOptions.InternalCall
,因此运行时是唯一可能的消费者,使得明确禁止它变得更加无趣。 - Jeroen Mostert