.ctor is bij iedereen bekend
.cctor is niet bekend en kan gemakkelijk verkeerd worden gebruikt
De zogenaamde .cctor is een statische constructor in de C#-syntaxis
Vormachtig
Overeenkomsten en verschillen tussen .cctor en .ctor
1. Je kunt geen toegangsrechtenidentificaties publiek, privé, enzovoort gebruiken, die niet gebruikt kunnen worden, wat anders is dan .ctor
2. Er mag geen retourwaarde zijn, wat hetzelfde is als .ctor
3. Er kunnen geen parameters zijn, .ctor kan meerdere parameters hebben
4. Er kan hooguit één zijn, en er moet minstens één .ctor zijn.
5. De programmeur kan de timing van de .cctor-aanroep niet beheersen; in zekere zin kan de programmeur de timing van zijn aanroep bepalen
6. Programmeurs kunnen .cctor of .ctor niet direct aanroepen. Wanneer de programmeur de nieuwe operator gebruikt, wordt .ctor zeker aangeroepen
.cctor-oproeptijd:
De statische constructor wordt automatisch aangeroepen voordat de eerste instantie wordt aangemaakt of een statisch lid wordt verwezen. (Dit is het originele citaat op MSDN)
Het is duidelijk dat .cctor slechts één keer wordt aangeroepen in hetzelfde programmadomein, in plaats van elke keer dat een object wordt geïnstantieerd zoals .ctor
Gebruik van .cctor
Statische constructors worden gebruikt om statische data te initialiseren, of om specifieke bewerkingen uit te voeren die slechts één keer hoeven te worden uitgevoerd.
Bijvoorbeeld:
Alle volgende code is gecompileerd in Windows 7, in tegenstelling tot de releasemodus van 2005, en als de resultaten anders zijn, overweeg dan om over te schakelen naar releasemodus en het opnieuw te proberen
Compileer dit codesegment en gebruik vervolgens ILDISM om het te bekijken; de methodetabel is als volgt
.ctor(): void // Dit is een instantie-constructor van de klasse die automatisch door de compiler wordt geleverd
Main():void(string[]) //Programma-toegangspunt
Natuurlijk zit er geen .cctor in de assembly, en zal de compiler geen .cctor-functies automatisch leveren wanneer een klasse geen statische velden heeft die geïnitialiseerd moeten worden, wat anders is dan .ctor, dat toch altijd bestaat
Wijzig de code
Bij het compileren van deze code zal er een waarschuwing zijn, maar dat is niet belangrijk, het belangrijkste is dat wanneer je de assembly met ILDASTOM bekijkt, de verwachte .cctor, statische constructor niet verschijnt!
Wat is er gebeurd?
Is de conclusie verkeerd? CCTOR is geen statisch veld dat wordt gebruikt om een klasse te initialiseren?
Doe rustig aan, kijk alsjeblieft even naar de code
Het enige verschil tussen deze code en de vorige is dat het de beginwaarde van het statische veld i verandert, en het volgende is het magische moment te zien
Laten we het DASM doen, en tot onze verbazing is de veelgevraagd .cctor eindelijk hier!
Bekijk de .cctor-implementatiecode en je zult zien:
.methode privé hidebysig specialnaam rtspecialname statisch void .cctor() cil managed
{ Codegrootte 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instantiated statische velden :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // einde van methode A::.cctor
Waarom is dat zo? De mogelijke reden is dat de standaardwaarde van het Int32-type 0 is, en dat de compiler dit detecteert en optimaliseert om geen .cctor-code te produceren
referentie
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Ten slotte kunnen we zelf een .cctor-functie implementeren om speciale functionele vereisten te realiseren
samenvatting 1、. CTOR is de constructiemethode; 2、. cctor is een type-initialiseerder, die een statische constructor is in C#; 3. Wanneer klasse C wordt geïnstantieerd, wijst het eerst een waarde toe aan het veld dat bij de declaratie is toegewezen, roept vervolgens de constructor van de basisklasse aan, en construeert zichzelf vervolgens op dezelfde manier, helemaal tot aan het topniveau System.Object, en komt dan terug om de code uit te voeren in C's expliciete constructiemethode, wat zo'n recursief proces is.
|