Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 31028|Svar: 1

[Källa] .ctor och .cctor i .net

[Kopiera länk]
Publicerad på 2017-04-06 14:56:38 | | | |
.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.





Föregående:Generiska kontextbundna objekt: ContextBoundObject och generiska klasser stöds inte
Nästa:Sammanfattning av exekveringsordningen för statiska, icke-statiska och konstruktiva metoder i en klass
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com