2017-02-15 4 views
12

В соответствии с разделом «10.12 Статические конструкторы» из «C# Language Specification. Version 5.0» статический конструктор может быть помечен модификатором «extern», и в этом случае он называется внешним статическим конструктором .Какова цель внешних статических конструкторов в C#?

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

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

И я также знаю об эзотерике extern конструкторы (см. Также this question). Например, класс String имеет несколько таких declarations, эти конструкторы реализованы во время выполнения.

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

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

+0

Я думаю, что вы найдете очень похожий фрагмент текста в каждом подразделе раздела 10 от 10.6 (Методы) до 10.13 (Деструкторы). Если ничего другого, по крайней мере, это * согласовано *. –

+1

Единственное, что делает 'extern', это установить RVA метода на 0. Время выполнения осталось выяснить остальные. См. Также http://stackoverflow.com/q/38015024/. Существует немного причин, по которым спецификация языка запрещает это, поскольку работа компилятора тривиальна (было бы больше работать, чтобы объявить вне закона). Кроме того, поскольку конструкторы не могут быть помечены как 'DllImport', единственный способ реализовать такие методы - с помощью' MethodImplOptions.InternalCall', поэтому среда выполнения является единственным возможным потребителем, что делает еще менее интересным явно запретить его. –

+0

Что касается того, почему они фактически не используются, это происходит в сфере спекуляций, но если бы я был разработчиком CLR, я бы предпочел сделать свою статическую инициализацию легко предсказать пятна, а не полагаться на довольно тайные правила для инициализации статических типов. В любом случае, весь этот код снова возвращается в среду выполнения, поэтому он не будет делать ничего, кроме моей работы. –

ответ

1

Из MSDN:

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

...

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

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

Смежные вопросы