.ctor je známý všem
.cctor není známý a může být snadno zneužit
Takzvaný .cctor je statický konstruktor v syntaxi C#
Tvar jako
Podobnosti a rozdíly mezi .cctor a .ctor
1. Nemůžete mít identifikátory přístupových práv veřejné, soukromé atd., které nelze použít, což je odlišné od .ctor
2. Nesmí existovat žádná vrácená hodnota, která je stejná jako .ctor
3. Nemůže existovat žádné parametry, .ctor může mít více parametrů
4. Může být maximálně jeden a musí existovat alespoň jeden .ctor
5. Programátor nemůže ovládat časování volání .cctor, v jistém smyslu může programátor ovládat časování jeho volání
6. Programátoři nemohou přímo volat .cctor, .ctor Když programátor použije nový operátor, bude určitě volán .ctor
.cctor časování hovorů:
Statický konstruktor je automaticky vyvolán před vytvořením první instance nebo před odkazem na statický člen. (Toto je původní citace na MSDN)
Je zřejmé, že .cctor je volán pouze jednou ve stejné programové doméně, na rozdíl od toho, aby byl volán pokaždé, když je objekt instancován jako .ctor
.cctor použití
Statické konstruktory se používají k inicializaci jakýchkoli statických dat nebo k provedení specifických operací, které je třeba provést pouze jednou.
Například:
Veškerý následující kód je zkompilován ve Windows 7, na rozdíl od režimu vydání 2005, a pokud jsou výsledky jiné, zvažte přepnutí do režimu vydání a pokus znovu
Zkompilujte tento segment kódu a poté použijte ILDISM k jeho zobrazení, tabulka metod je následující
.ctor(): void // Toto je inscenční konstruktor třídy automaticky poskytovaný kompilátorem
Main():void(string[]) //Vstupní bod programu
Samozřejmě v assembleru není .cctor a kompilátor automaticky neposkytne .cctor funkce, pokud třída nemá statická pole, která je třeba inicializovat, což je jiné než .ctor, který stejně vždy existuje
Upravte kód
Při kompilaci tohoto kódu se objeví varování, ale to není důležité, důležité je, že při prohlížení assembleru pomocí ILDASTOM se očekávaný .cctor, statický konstruktor neobjeví!
Co se přihodilo?
Je ten závěr špatný? CCTOR není statické pole používané k inicializaci třídy?
Klid, prosím, podívejte se na kód
Jediný rozdíl mezi tímto kódem a předchozím je, že mění počáteční hodnotu statického pole i, a další věcí je být svědkem magického momentu
Pojďme to DASMovat a k našemu překvapení je konečně tady tolik žádaný .cctor!
Podívejte se na implementační kód .cctor a uvidíte:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Velikost kódu 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instancujte statická pole :-) IL_0001: stsfld int32 only_lonely. Odpověď::i IL_0006: reaktiv } // konec metody A::.cctor
Proč tomu tak je? Možným důvodem je, že výchozí hodnota typu Int32 je 0, kterou kompilátor detekuje a optimalizuje tak, aby nevytvářela kód .cctor
odkaz
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Nakonec můžeme sami implementovat funkci .cctor pro implementaci speciálních funkčních požadavků
shrnutí 1、. CTOR je metoda konstrukce; 2、. cctor je inicializátor typu, což je statický konstruktor v C#; 3. Když je třída C instancována, nejprve přiřadí hodnotu poli, které je přiřazeno v době deklarace, poté zavolá konstruktora základní třídy a poté se konstruuje stejným způsobem až k nejvyšší úrovni System.Object, a poté se vrátí, aby spustila kód v explicitní konstrukční metodě C, což je takový rekurzivní proces.
|