.ctor er kjent for alle
.cctor er ikke kjent og kan lett misbrukes
Den såkalte .cctor-en er en statisk konstruktør i C#-syntaksen
Formlignende
Likheter og forskjeller mellom .cctor og .ctor
1. Du kan ikke ha tilgangsrettighetsidentifikatorer offentlig, privat osv., som ikke kan brukes, noe som er forskjellig fra .ctor
2. Det må ikke finnes noen returverdi, som er det samme som .ctor
3. Det kan ikke finnes parametere, .ctor kan ha flere parametere
4. Det kan maksimalt være én, og det må være minst én .ctor
5. Programmereren kan ikke kontrollere tidspunktet for .cctor-kallet, på en måte kan programmereren kontrollere tidspunktet for kallet
6. Programmerere kan ikke direkte kalle .cctor, .ctor Når programmereren bruker den nye operatoren, vil .ctor definitivt bli kalt
.cctor-anropstidspunkt:
Den statiske konstruktøren kalles automatisk før den første instansen opprettes eller et statisk medlem refereres. (Dette er det opprinnelige sitatet på MSDN)
Det er klart at .cctor kun kalles én gang i samme programdomene, i stedet for å bli kalt hver gang et objekt instansieres, slik som .ctor
bruk av .cctor
Statiske konstruktører brukes til å initialisere statiske data, eller til å utføre spesifikke operasjoner som bare trenger å utføres én gang.
For eksempel:
All følgende kode er kompilert i Windows 7, i motsetning til 2005 Release Mode, og hvis resultatene er forskjellige, vurder å bytte til release mode og prøve igjen
Kompil dette kodesegmentet og bruk deretter ILDISM for å vise det, metodetabellen er som følger
.ctor(): void // Dette er en instanskonstruktør av klassen som automatisk gis av kompilatoren
Main():void(string[]) //Program entry point
Selvfølgelig finnes det ingen .cctor i assembleren, og kompilatoren vil ikke automatisk tilby .cctor-funksjoner når en klasse ikke har statiske felt som må initialiseres, noe som er forskjellig fra .ctor, som uansett alltid eksisterer
Endre koden
Når jeg kompilerer denne koden, vil det komme en advarsel, men det er ikke viktig, det viktige er at når man ser på assemblyen med ILDASTOM, vises ikke den forventede .cctor, statiske konstruktøren!
hva har skjedd?
Er slutningen feil? Er ikke CCTOR et statisk felt som brukes til å initialisere en klasse?
Ta det med ro, vennligst ta en titt på koden
Den eneste forskjellen mellom denne koden og den forrige er at den endrer startverdien til det statiske feltet i, og det neste er å være vitne til det magiske øyeblikket
La oss bruke DASM, og til vår overraskelse er den etterspurte .cctor-en endelig her!
Se på .cctor-implementasjonskoden, så vil du se:
.metode privat hidebysig spesialnavn rtspecialname statisk void .cctor() cil managed
{ Kodestørrelse 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instansier statiske felt :-) IL_0001: Stsfld int32 only_lonely. A::i IL_0006: ret. } // slutt på metode A::.cctor
Hvorfor er det slik? Den mulige grunnen er at standardverdien for Int32-typen er 0, og kompilatoren oppdager dette og optimaliserer det slik at det ikke produserer .cctor-kode
referanse
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Til slutt kan vi selv implementere en .cctor-funksjon for å implementere spesielle funksjonelle krav
sammendrag 1、. CTOR er konstruksjonsmetoden; 2、. cctor er en typeinitialisator, som er en statisk konstruktør i C#; 3. Når klasse C instansieres, vil den først tildele en verdi til feltet som er tildelt ved deklarasjonstidspunktet, og deretter kalle konstruktøren av basisklassen, og deretter konstruere seg selv på samme måte, helt til toppnivået System.Object, og så komme tilbake for å kjøre koden i C sin eksplisitte konstruksjonsmetode, som er en så rekursiv prosess.
|