.ctor yra žinomas visiems
.cctor nėra pažįstamas ir gali būti lengvai piktnaudžiaujama
Vadinamasis .cctor yra statinis konstruktorius C# sintaksėje
Forma panaši į
.cctor ir .ctor panašumai ir skirtumai
1. Negalite turėti prieigos teisių identifikatorių viešų, privačių ir t. t., kurių negalima naudoti, o tai skiriasi nuo .ctor
2. Neturi būti grąžinamos reikšmės, kuri yra tokia pati kaip .ctor
3. Negali būti parametrų, .ctor gali turėti kelis parametrus
4. Gali būti tik vienas, ir turi būti bent vienas .ctor
5. Programuotojas negali kontroliuoti .cctor skambučio laiko, tam tikra prasme programuotojas gali kontroliuoti jo skambučio laiką
6. Programuotojai negali tiesiogiai iškviesti .cctor, .ctor Kai programuotojas naudoja naują operatorių, .ctor tikrai bus iškviestas
.cctor skambučio laikas:
Statinis konstruktorius automatiškai iškviečiamas prieš sukuriant pirmąjį egzempliorių arba nurodant bet kurį statinį narį. (Tai originali citata MSDN)
Akivaizdu, kad .cctor iškviečiamas tik vieną kartą tame pačiame programos domene, o ne iškviečiamas kiekvieną kartą, kai objektas yra instanciuojamas kaip .ctor
.cctor naudojimas
Statiniai konstruktoriai naudojami bet kokiems statiniams duomenims inicijuoti arba konkrečioms operacijoms, kurias reikia atlikti tik vieną kartą, atlikti.
Pavyzdžiui:
Visas šis kodas yra kompiliuojamas Windows 7, palyginti su 2005 m. išleidimo režimu, o jei rezultatai skiriasi, apsvarstykite galimybę perjungti į atleidimo režimą ir bandyti dar kartą
Kompiliuokite šį kodo segmentą ir naudokite ILDISM, kad jį peržiūrėtumėte, metodų lentelė yra tokia
.ctor(): void // Tai yra kompiliatoriaus automatiškai pateiktos klasės egzemplioriaus konstruktorius
main():void(string[]) //Programos įėjimo taškas
Akivaizdu, kad rinkinyje nėra .cctor, o kompiliatorius automatiškai nepateiks .cctor funkcijų, kai klasė neturi statinių laukų, kuriuos reikia inicijuoti, o tai skiriasi nuo .ctor, kuris visada egzistuoja
Kodo modifikavimas
Sudarant šį kodą, bus įspėjimas, bet tai nėra svarbu, svarbu tai, kad žiūrint agregatą su ILDASTOM, laukiamas .cctor, statinis konstruktorius nepasirodo!
kas atsitiko?
Ar išvada neteisinga?. CCTOR nėra statinis laukas, naudojamas klasei inicijuoti?
Atsipalaiduokite, pažvelkite į kodą
Vienintelis skirtumas tarp šio kodo ir ankstesnio yra tas, kad jis keičia pradinę statinio lauko i vertę, o kitas dalykas yra stebuklingos akimirkos liudininkas
Leiskite DASM ir, mūsų nuostabai, labai prašomas .cctor pagaliau čia!
Pažvelkite į .cctor diegimo kodą ir pamatysite:
.method privatus hidebysig specialname rtspecialname statinis void .cctor() cil valdomas
{ Kodo dydis 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Sukurkite statinius laukus :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // A metodo pabaiga::.cctor
Kodėl taip yra? Galima priežastis yra ta, kad numatytoji Int32 tipo reikšmė yra 0, o kompiliatorius tai aptinka ir optimizuoja, kad nesukurtų .cctor kodo
Nuoroda
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Galiausiai galime patys įdiegti .cctor funkciją, kad įgyvendintume specialius funkcinius reikalavimus
suvestinė 1、. ctor yra statybos metodas; 2、. cctor yra tipo iniciatorius, kuris yra statinis konstruktorius C#; 3. Kai C klasė yra instanciuojama, ji pirmiausia priskirs reikšmę laukui, kuris yra priskirtas deklaravimo metu, ir tada iškvies bazinės klasės konstruktorių, o tada sukonstruos save tokiu pačiu būdu, iki aukščiausio lygio System.Object, o tada grįš vykdyti kodą C aiškiu konstravimo metodu, kuris yra toks rekursinis procesas.
|