.ctor är känd av alla
.cctor är inte bekant och kan lätt missbrukas
Den så kallade .cctorn är en statisk konstruktör i C#-syntaxen
Formlik
Likheter och skillnader mellan .cctor och .ctor
1. Du kan inte ha åtkomsträttighetsidentifierare offentliga, privata osv., som inte kan användas, vilket skiljer sig från .ctor
2. Det får inte finnas något returvärde, vilket är samma som .ctor
3. Det kan inte finnas några parametrar, .ctor kan ha flera parametrar
4. Det kan högst finnas en, och det måste finnas minst en .ctor
5. Programmeraren kan inte kontrollera tidpunkten för .cctor-anropet, på ett sätt kan programmeraren kontrollera tidpunkten för sitt anrop
6. Programmerare kan inte direkt anropa .cctor, .ctor När programmeraren använder den nya operatorn kommer .ctor definitivt att anropas
.cctor-samtalstid:
Den statiska konstruktorn anropas automatiskt innan den första instansen skapas eller någon statisk medlem refereras. (Detta är det ursprungliga citatet på MSDN)
Det är tydligt att .cctor anropas endast en gång i samma programdomän, istället för att anropas varje gång ett objekt instansieras som .ctor
.cctor-användning
Statiska konstruktorer används för att initiera statisk data eller för att utföra specifika operationer som bara behöver utföras en gång.
Till exempel:
All följande kod är kompilerad i Windows 7, jämfört med 2005 års releaseläge, och om resultaten är annorlunda, överväg att byta till releaseläge och försöka igen
Kompiliera detta kodsegment och använd sedan ILDISM för att visa det, metodtabellen är som följer
.ctor(): void // Detta är en instanskonstruktör av klassen som automatiskt tillhandahålls av kompilatorn
Main():void(string[]) //Programingångspunkt
Uppenbarligen finns det ingen .cctor i assembleren, och kompilatorn kommer inte automatiskt att tillhandahålla .cctor-funktioner när en klass inte har statiska fält som behöver initieras, vilket skiljer sig från .ctor, som ändå alltid finns
Modifiera koden
När jag kompilerar denna kod kommer det att finnas en varning, men det är inte viktigt, det viktiga är att när man ser assemblyn med ILDASTOM så visas inte den förväntade .cctor, statiska konstruktören!
Vad hände?
Är slutsatsen fel? Är inte CCTOR ett statiskt fält som används för att initiera en klass?
Ta det lugnt, titta gärna på koden
Den enda skillnaden mellan denna kod och den föregående är att den ändrar det initiala värdet på det statiska fältet i, och nästa sak är att bevittna det magiska ögonblicket
Låt oss DASSA den, och till vår förvåning är den mycket efterfrågade .cctor äntligen här!
Titta på .cctor-implementeringskoden så ser du:
.method privat hidebysig specialnamn rtspecialname statiskt void .cctor() cil managed
{ Kodstorlek 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instansier statiska fält :-) IL_0001: Stsfld int32 only_lonely. A::i IL_0006: ret. } // slut på metod A::.cctor
Varför är det så? Den möjliga orsaken är att standardvärdet för Int32-typen är 0, och kompilatorn upptäcker detta och optimerar det för att inte producera .cctor-kod
hänvisning
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Slutligen kan vi själva implementera en .cctor-funktion för att implementera särskilda funktionella krav
sammanfattning 1、. CTOR är konstruktionsmetoden; 2、. cctor är en typinitialiserare, som är en statisk konstruktör i C#; 3. När klass C instansieras kommer den först att tilldela ett värde till fältet som tilldelas vid deklarationstillfället, och sedan anropa basklassens konstruktör, och sedan konstruera sig själv på samma sätt, hela vägen till toppnivåns System.Object, och sedan återvända för att köra koden i C:s explicita konstruktionsmetod, som är en så rekursiv process.
|