.ctor je známy každému
.cctor nie je známy a môže byť ľahko zneužitý
Takzvaný .cctor je statický konštruktor v syntaxi C#
Tvar ako
Podobnosti a rozdiely medzi .cctor a .ctor
1. Nemôžete mať identifikátory prístupových práv verejné, súkromné a podobne, ktoré sa nedajú použiť, čo je odlišné od .ctor
2. Nesmie existovať žiadna vrátená hodnota, ktorá je rovnaká ako .ctor
3. Nemôžu existovať žiadne parametre, .ctor môže mať viacero parametrov
4. Môže byť maximálne jeden a musí existovať aspoň jeden .ctor
5. Programátor nemôže ovládať načasovanie volania .cctor, v istom zmysle môže programátor ovládať načasovanie jeho volania
6. Programátori nemôžu priamo volať .cctor, .ctor Keď programátor použije nový operátor, .ctor sa určite volá
Časovanie hovorov .cctor:
Statický konštruktor sa automaticky volá pred vytvorením prvej inštancie alebo pred referencovaním akéhokoľvek statického člena. (Toto je pôvodný citát na MSDN)
Je zrejmé, že .cctor sa volá iba raz v tej istej programovej doméne, namiesto toho, aby bol volaný vždy, keď sa objekt inštancionuje ako .ctor
.cctor použitie
Statické konštruktory sa používajú na inicializáciu akýchkoľvek statických dát alebo na vykonanie špecifických operácií, ktoré je potrebné vykonať len raz.
Napríklad:
Celý nasledujúci kód je skompilovaný vo Windows 7, na rozdiel od režimu vydania z roku 2005, a ak sú výsledky odlišné, zvážte prechod do režimu vydania a skúšanie znova
Skompilujte tento segment kódu a potom použite ILDISM na jeho zobrazenie, tabuľka metód je nasledovná
.ctor(): void // Toto je inštancia konštruktora triedy automaticky poskytovanej kompilátorom
Main():void(string[]) //Vstupný bod programu
Samozrejme, v assembleri nie je .cctor a kompilátor automaticky neposkytne .cctor funkcie, keď trieda nemá statické polia, ktoré je potrebné inicializovať, čo sa líši od .ctor, ktorý aj tak vždy existuje
Úprava kódu
Pri kompilácii tohto kódu bude varovanie, ale to nie je dôležité, dôležité je, že pri prezeraní assembleru pomocou ILDASTOM sa očakávaný .cctor, statický konštruktor nezobrazí!
čo sa stalo?
Je záver nesprávny? CCTOR nie je statické pole používané na inicializáciu triedy?
Upokoj sa, prosím, pozri sa na kód
Jediný rozdiel medzi týmto kódom a predchádzajúcim je, že mení počiatočnú hodnotu statického poľa i, a ďalšia vec je sledovať magický moment
Poďme to DASM-ovať a na naše prekvapenie je konečne tu dlho žiadaný .cctor!
Pozrite sa na implementačný kód .cctor a uvidíte:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Veľkosť kódu 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Inštancujte statické polia :-) IL_0001: stsfld int32 only_lonely. Odpoveď::i IL_0006: v zálohe } // koniec metódy A::.cctor
Prečo je to tak? Možným dôvodom je, že predvolená hodnota typu Int32 je 0, a kompilátor to detekuje a optimalizuje tak, aby nevytváral .cctor kód
referencia
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Nakoniec môžeme sami implementovať .cctor funkciu na implementáciu špeciálnych funkčných požiadaviek
súhrn 1、. CTOR je metóda konštrukcie; 2、. cctor je inicializátor typu, ktorý je statickým konštruktorom v jazyku C#; 3. Keď je trieda C inštancovaná, najprv priradí hodnotu poľu, ktoré je priradené v čase deklarácie, potom zavolá konštruktora základnej triedy a potom sa konštruuje rovnakým spôsobom, až po najvyššiu úroveň System.Object, a potom sa vráti, aby vykonala kód v explicitnej metóde konštrukcie C, čo je takýto rekurzívny proces.
|