.ctor ist jedem bekannt.
.cctor ist nicht vertraut und kann leicht missbraucht werden
Der sogenannte .cctor ist ein statischer Konstruktor in der C#-Syntax
Form wie
Ähnlichkeiten und Unterschiede zwischen .cctor und .ctor
1. Du kannst keine Zugriffsberechtigungskennungen öffentlich, privat usw. verwenden, die nicht verwendet werden können, was sich von .ctor unterscheidet
2. Es darf keinen Rückgabewert geben, was mit .ctor identisch ist
3. Es kann keine Parameter geben, .ctor kann mehrere Parameter haben
4. Es kann höchstens eine geben, und es muss mindestens eine .ctor geben
5. Der Programmierer kann das Timing des .cctor-Aufrufs nicht kontrollieren; in gewisser Weise kann er das Timing seines Aufrufs steuern.
6. Programmierer können .cctor, .ctor nicht direkt aufrufen Wenn der Programmierer den neuen Operator verwendet, wird .ctor definitiv aufgerufen
.cctor-Anrufzeit:
Der statische Konstruktor wird automatisch aufgerufen, bevor die erste Instanz erstellt oder ein statisches Element referenziert wird. (Dies ist das Originalzitat auf MSDN)
Es ist klar, dass .cctor nur einmal in derselben Programmdomäne aufgerufen wird, anstatt jedes Mal aufgerufen zu werden, wenn ein Objekt wie .ctor instanziiert wird
Verwendung von .cctor
Statische Konstruktoren werden verwendet, um statische Daten zu initialisieren oder spezifische Operationen durchzuführen, die nur einmal ausgeführt werden müssen.
Zum Beispiel:
Der gesamte folgende Code wird im Windows-7-Release-Modus kompiliert, im Release-Modus von 2005, und wenn die Ergebnisse unterschiedlich sind, solltest du in Erwägung ziehen, in den Release-Modus zu wechseln und es erneut zu versuchen
Kompilieren Sie diesen Codeabschnitt und verwenden Sie dann ILDISM, um ihn anzusehen; die Methodentabelle ist wie folgt
.ctor(): void // Dies ist ein Instanzkonstruktor der Klasse, die automatisch vom Compiler bereitgestellt wird
Main():void(string[]) //Programm-Einstiegspunkt
Offensichtlich gibt es keine .cctor in der Assembler, und der Compiler stellt keine .cctor-Funktionen bereit, wenn eine Klasse keine statischen Felder hat, die initialisiert werden müssen, was sich von .ctor unterscheidet, das ohnehin immer existiert
Ändern Sie den Code
Beim Kompilieren dieses Codes gibt es eine Warnung, aber das ist nicht wichtig, wichtig ist, dass beim Betrachten der Assembly mit ILDASTOM der erwartete .cctor, statische Konstruktor nicht erscheint!
Was ist passiert?
Ist die Schlussfolgerung falsch? Ist CCTOR kein statisches Feld, das zur Initialisierung einer Klasse verwendet wird?
Ganz ruhig, bitte schau dir den Code an
Der einzige Unterschied zwischen diesem Code und dem vorherigen ist, dass er den Anfangswert des statischen Feldes i verändert und als Nächstes den magischen Moment beobachtet
Lass es uns mit DASM machen, und zu unserer Überraschung ist der viel erwünschte .cctor endlich da!
Schau dir den .cctor-Implementierungscode an, und du wirst sehen:
.Methode privat hidebysig spezialname rtspecialname statisch void .cctor() cil managed
{ Codegröße 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instanziere statische Felder :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: Ret } // Ende der Methode A::.cctor
Warum ist das so? Der mögliche Grund ist, dass der Standardwert des Int32-Typs 0 ist und der Compiler dies erkennt und optimiert, um keinen .cctor-Code zu erzeugen
Referenz
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Schließlich können wir selbst eine .cctor-Funktion implementieren, um spezielle funktionale Anforderungen zu erfüllen
Zusammenfassung 1、. CTOR ist die Baumethode; 2、. cctor ist ein Typinitialisierer, der ein statischer Konstruktor in C# ist; 3. Wenn Klasse C instanziiert wird, weist sie zunächst dem Feld zu, der zum Zeitpunkt der Deklaration zugewiesen wird, ruft dann den Konstruktør der Basisklasse auf und konstruiert sich auf dieselbe Weise bis zum obersten System.Object, und kehrt dann zurück, um den Code in Cs expliziter Konstruktionsmethode auszuführen, die ein so rekursiver Prozess ist.
|