Подтвердить что ты не робот

Какова цель внешних статических конструкторов в С#?

В соответствии с разделом "10.12 Статические конструкторы" "Статический конструктор языка С# версии 5.0" статический конструктор может быть помечен модификатором "extern", и в этом случае он называется внешним статическим конструктором.

Обычные (не внешние) статические конструкторы хорошо известны. Они используются для инициализации статических полей и свойств.

Внешние статические методы часто используются для вызова собственных функций через P/Invoke.

И я также знаю довольно эзотерические конструкторы extern (см. также этот вопрос). Например, класс String имеет несколько таких деклараций, эти конструкторы реализуются средой выполнения.

Но существуют ли какие-либо реальные применения внешних статических конструкторов? Я просмотрел coreclr repo и ничего не нашел. Спецификация языка не могла дать описание какой-либо конструкции, которая никогда не использовалась в дикой природе. Или может?

Мое предположение: С# имеет внешние статические конструкторы только потому, что CLR поддерживает их (в принципе).

4b9b3361

Ответ 1

Из MSDN:

Когда объявление конструктора включает в себя модификатор extern, конструктор называется внешним конструктором. Потому что внешний Декларация конструктора не обеспечивает фактической реализации, ее конструктор-тело состоит из точки с запятой.

...

Кажется, мы не можем думать о хорошей причине использования этой декларации, и она верна. Но когда вы копаете дальше, вы понимаете там целый мир динамической сборки или - Генерация кода.

Если вам нужно разработать компилятор для платформы .NET, вам, вероятно, понадобятся некоторые решения обмана, как это делает компилятор С#. Я могу понять, что некоторые основные реализации используют extern-конструктор, который реализуется где-то еще по хорошим причинам дизайна.