Какова цель внешних статических конструкторов в С#?
В соответствии с разделом "10.12 Статические конструкторы" "Статический конструктор языка С# версии 5.0" статический конструктор может быть помечен модификатором "extern", и в этом случае он называется внешним статическим конструктором.
Обычные (не внешние) статические конструкторы хорошо известны. Они используются для инициализации статических полей и свойств.
Внешние статические методы часто используются для вызова собственных функций через P/Invoke.
И я также знаю довольно эзотерические конструкторы extern (см. также этот вопрос). Например, класс String
имеет несколько таких деклараций, эти конструкторы реализуются средой выполнения.
Но существуют ли какие-либо реальные применения внешних статических конструкторов? Я просмотрел coreclr repo и ничего не нашел. Спецификация языка не могла дать описание какой-либо конструкции, которая никогда не использовалась в дикой природе. Или может?
Мое предположение: С# имеет внешние статические конструкторы только потому, что CLR поддерживает их (в принципе).
Ответы
Ответ 1
Из MSDN:
Когда объявление конструктора включает в себя модификатор extern, конструктор называется внешним конструктором. Потому что внешний Декларация конструктора не обеспечивает фактической реализации, ее конструктор-тело состоит из точки с запятой.
...
Кажется, мы не можем думать о хорошей причине использования этой декларации, и она верна.
Но когда вы копаете дальше, вы понимаете там целый мир динамической сборки или - Генерация кода.
Если вам нужно разработать компилятор для платформы .NET, вам, вероятно, понадобятся некоторые решения обмана, как это делает компилятор С#. Я могу понять, что некоторые основные реализации используют extern-конструктор, который реализуется где-то еще по хорошим причинам дизайна.