.ctor je znan vsem
.cctor ni znan in ga je mogoče zlahka napačno uporabiti
Tako imenovani .cctor je statični konstruktor v C# sintaksi
Oblika kot
Podobnosti in razlike med .cctor in .ctor
1. Ne morete imeti identifikatorjev dostopnih pravic javnih, zasebnih itd., ki jih ni mogoče uporabljati, kar je drugače kot .ctor
2. Ne sme biti vrnjene vrednosti, ki je enaka kot .ctor
3. Parametrov ne more biti, .ctor lahko vsebuje več parametrov
4. Lahko je največ eden, in mora biti vsaj en .ctor
5. Programer ne more nadzorovati časa klica .cctor, v nekem smislu lahko programer nadzoruje čas klica
6. Programerji ne morejo neposredno klicati .cctor, .ctor Ko programer uporabi novega operatorja, bo .ctor zagotovo poklican
.cctor čas klicev:
Statični konstruktor se samodejno pokliče pred ustvarjanjem prve instance ali pred referenco kateregakoli statičnega člana. (To je izvirni citat na MSDN)
Jasno je, da se .cctor kliče le enkrat v isti programski domeni, ne pa vsakič, ko se objekt instancira, kot je .ctor
.cctor uporaba
Statični konstruktorji se uporabljajo za inicializacijo statičnih podatkov ali za izvajanje specifičnih operacij, ki jih je treba izvesti le enkrat.
Na primer:
Vsa naslednja koda je prevedena v Windows 7, v primerjavi z načinom izdaje iz leta 2005, in če so rezultati drugačni, razmislite o prehodu v način izdaje in poskusu znova
Prevedite ta del kode in nato uporabite ILDISM za ogled, tabela metod je naslednja
.ctor(): void // To je konstruktor instanc razreda, ki ga samodejno zagotovi prevajalnik
Main():void(string[]) //Vstopna točka programa
Očitno v asemblerju ni .cctorja, prevajalnik pa ne bo samodejno zagotovil .cctor funkcij, kadar razred nima statičnih polj, ki jih je treba inicializirati, kar je drugače kot .ctor, ki tako ali tako vedno obstaja
Spremenite kodo
Pri prevajanju te kode se pojavi opozorilo, vendar to ni pomembno, pomembno je, da se pri ogledu sestavljanja z ILDASTOM-om pričakovani .cctor, statični konstruktor, ne pojavi!
kaj se je zgodilo?
Ali je sklep napačen? CCTOR ni statično polje, ki se uporablja za inicializacijo razreda?
Umiri se, prosim, poglej kodo
Edina razlika med to kodo in prejšnjo je, da spremeni začetno vrednost statičnega polja i, nato pa je opazovanje čarobnega trenutka
Naredimo ga DASM, in na naše presenečenje je končno tukaj dolgo želeni .cctor!
Poglejte implementacijsko kodo .cctor in videli boste:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Velikost kode 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Vzpostavi statična polja :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: upokojeni } // konec metode A::.cctor
Zakaj je temu tako? Možen razlog je, da je privzeta vrednost tipa Int32 0, prevajalnik pa to zazna in optimizira, da ne ustvari .cctor kode
Referenčni
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Nazadnje lahko sami implementiramo .cctor funkcijo za implementacijo posebnih funkcionalnih zahtev
Povzetek 1、. CTOR je metoda konstrukcije; 2、. cctor je inicializator tipov, ki je statični konstruktor v C#; 3. Ko je razred C instanciran, najprej dodeli vrednost polju, ki je dodeljeno ob deklaraciji, nato pokliče konstruktorja osnovnega razreda, nato se konstruira na enak način, vse do najvišjega System.Object, nato pa se vrne, da izvede kodo v eksplicitni metodi gradnje C, ki je tak rekurziven proces.
|