.ctor er kendt af alle
.cctor er ikke velkendt og kan let misbruges
Den såkaldte .cctor er en statisk konstruktør i C#-syntaks
Formlignende
Ligheder og forskelle mellem .cctor og .ctor
1. Du kan ikke have adgangsrettighedsidentitegnere offentlige, private osv., som ikke kan bruges, hvilket er forskelligt fra .ctor
2. Der må ikke være nogen returværdi, som er den samme som .ctor
3. Der kan ikke være parametre, .ctor kan have flere parametre
4. Der kan højst være én, og der skal være mindst én .ctor.
5. Programmøren kan ikke kontrollere timingen af .cctor-kaldet; på en måde kan programmøren styre timingen af sit kald
6. Programmører kan ikke direkte kalde .cctor, .ctor Når programmøren bruger den nye operator, vil .ctor helt sikkert blive kaldt
.cctor-opkaldstidspunkt:
Den statiske konstruktør kaldes automatisk, før den første instans oprettes eller et statisk medlem refereres. (Dette er det oprindelige citat på MSDN)
Det er klart, at .cctor kun kaldes én gang i samme programdomæne, i stedet for at blive kaldt hver gang et objekt instansieres, som .ctor
.cctor-brug
Statiske konstruktører bruges til at initialisere statiske data eller til at udføre specifikke operationer, der kun behøver at udføres én gang.
For eksempel:
Al den følgende kode er kompileret i Windows 7 i modsætning til 2005 Release mode, og hvis resultaterne er anderledes, kan du overveje at skifte til release mode og prøve igen
Kompiler dette kodesegment og brug derefter ILDISM til at se det, metodetabellen er som følger
.ctor(): void // Dette er en instanskonstruktør af klassen, som compileren automatisk leverer,
Main():void(string[]) //Program entry point
Selvfølgelig er der ingen .cctor i assemblyen, og compileren vil ikke automatisk levere .cctor-funktioner, når en klasse ikke har statiske felter, der skal initialiseres, hvilket er forskelligt fra .ctor, som alligevel altid eksisterer
Ændr koden
Når jeg kompilerer denne kode, vil der være en advarsel, men det er ikke vigtigt, det vigtige er, at når man ser assemblyen med ILDASTOM, vises den forventede .cctor, statiske konstruktør ikke!
Hvad skete der?
Er slutningen forkert? CCTOR er ikke et statisk felt, der bruges til at initialisere en klasse?
Tag det roligt, kig venligst på koden
Den eneste forskel mellem denne kode og den forrige er, at den ændrer den oprindelige værdi af det statiske felt i, og det næste er at være vidne til det magiske øjeblik
Lad os DAM det, og til vores overraskelse er den meget efterspurgte .cctor endelig her!
Se på .cctor-implementeringskoden, og du vil se:
.metode privat hidebysig specialnavn rtspecialname statisk void .cctor() cil managed
{ Kodestørrelse 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instansier statiske felter :-) IL_0001: Stsfld int32 only_lonely. A::i IL_0006: ret } // slut på metode A::.cctor
Hvorfor er det sådan? Den mulige grund er, at standardværdien for Int32-typen er 0, og compileren registrerer dette og optimerer det, så den ikke producerer .cctor-kode
henvisning
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Endelig kan vi selv implementere en .cctor-funktion for at implementere særlige funktionelle krav
resumé 1、. CTOR er konstruktionsmetoden; 2、. cctor er en typeinitializer, som er en statisk konstruktør i C#; 3. Når klasse C instansieres, vil den først tildele en værdi til feltet, der er tildelt ved deklarationstidspunktet, og derefter kalde konstruktøren af basisklassen, og derefter konstruere sig selv på samme måde, hele vejen til topniveauet System.Object, og derefter vende tilbage for at udføre koden i C's eksplicitte konstruktionsmetode, som er en så rekursiv proces.
|