Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 31028|Odpoveď: 1

[Zdroj] .ctor a .cctor z .net

[Kopírovať odkaz]
Zverejnené 6. 4. 2017 14:56:38 | | | |
.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.





Predchádzajúci:Generické objekty viazané na kontext: ContextBoundObject a generické triedy nie sú podporované
Budúci:Zhrnutie poradia vykonávania statických, nestatických a konštruktívnych metód v triede
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com