2017-02-15 2 views
12

Entsprechend dem Abschnitt "10.12 Static constructors" von "C# Language Specification. Version 5.0" statischen Konstruktor kann mit "extern" Modifizierer markiert werden und in diesem Fall ist es ein externen statischen Konstruktor.Welchen Zweck haben externe statische Konstruktoren in C#?

Die gewöhnlichen (nicht-externen) statischen Konstruktoren sind wohlbekannt. Sie werden verwendet, um statische Felder und Eigenschaften zu initialisieren.

Die externen statischen Methoden werden oft verwendet, um native Funktionen über P/Invoke aufzurufen.

Und ich bin auch bewusst ziemlich esoterisch extern Konstruktoren (siehe auch this question). Zum Beispiel hat String Klasse mehrere solche declarations, diese Konstruktoren werden von der Laufzeit implementiert.

Aber sind die realen Verwendungen von externen statischen Konstrukteuren? Ich habe die coreclr repo durchsucht und nichts gefunden. Die Sprachspezifikation konnte keinem Konstrukt eine Beschreibung geben, das niemals in freier Wildbahn verwendet wurde. Oder könnte?

Meine Vermutung: C# hat externe statische Konstruktoren, nur weil CLR sie (im Prinzip) unterstützt.

+0

Ich denke, Sie werden einen sehr ähnlichen Textabschnitt in jedem Unterabschnitt von Abschnitt 10 von 10.6 (Methoden) bis 10.13 (Destruktoren) finden. Wenn nichts anderes, ist es zumindest * konsistent *. –

+1

Das einzige, was 'extern' tut, ist, den RVA der Methode auf 0 zu setzen. Die Laufzeit bleibt übrig, um den Rest herauszufinden. Siehe auch http://stackoverflow.com/q/38015024/. Es gibt wenig Grund für die Sprachspezifikation, dies zu verbieten, da die Arbeit des Compilers trivial ist (es wäre mehr Arbeit, sie zu verbieten). Da Konstruktoren nicht mit 'DllImport' gekennzeichnet werden können, besteht die einzige Möglichkeit, solche Methoden mit' MethodImplOptions.InternalCall' zu implementieren, so dass die Laufzeit der einzig mögliche Konsument ist, sodass es noch weniger interessant ist, dies explizit zu verbieten. –

+0

Warum sie nicht wirklich verwendet werden, das gehört in den Bereich der Spekulation, aber wenn ich ein CLR-Implementierer wäre, würde ich lieber meine statische Initialisierung in einfach zu prognostizierenden Spots machen, anstatt mich auf die ziemlich geheimnisvollen Regeln zu verlassen zur Initialisierung von statischen Typen. All dieser Code ruft sowieso wieder in der Laufzeit auf, also würde es nichts anderes machen, als meine Arbeit zu erschweren. –

Antwort

1

Von MSDN:

Wenn eine Konstruktor Deklaration enthält einen externen Modifikator, die Konstruktor gesagt wird ein externer Konstruktor sein. Da eine externe Konstruktordeklaration keine tatsächliche Implementierung bereitstellt, besteht sein Konstruktorkörper aus einem Semikolon.

...

Es scheint, dass wir nicht von einem guten Grund für die Verwendung dieser Erklärung und es ist sicher richtig denken kann. Aber wenn Sie weiter graben, erkennen Sie, dass es eine ganze Welt der dynamischen Montage oder - Code Generation gibt.

Wenn Sie einen Compiler für die .NET-Plattform entwickeln würden, benötigen Sie wahrscheinlich einige Tricks, wie auch der C# -Compiler. Ich kann erkennen, dass einige Core-Implementierungen externen Konstruktor verwenden, der aus guten Designgründen an anderer Stelle implementiert wird.

Verwandte Themen