Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 31028|Antwort: 1

[Quelle] .ctor und .cctor von .NET

[Link kopieren]
Veröffentlicht am 06.04.2017 14:56:38 | | | |
.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.





Vorhergehend:Generische kontextgebundene Objekte: ContextBoundObject und generische Klassen werden nicht unterstützt
Nächster:Zusammenfassung der Ausführungsreihenfolge statischer, nicht-statischer und konstruktiver Methoden in einer Klasse
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com