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