.ctor mindenki számára ismert
.cctor nem ismerős, könnyen vissza lehet használni
Az úgynevezett .cctor egy statikus konstruktor a C# szintaxisban
Olyan alak, mint
Hasonlóságok és különbségek a .cctor és a .ctor között
1. Nem lehet hozzáférési jogazonosítók nyilvános, privát stb., amelyek nem használhatók, ami eltér a .ctor-tól
2. Nem lehet visszatérítési érték, ami ugyanaz, mint a .ctor
3. Nem lehetnek paraméterek, a .ctornak több paramétere is lehet
4. Legfeljebb egy lehet, és legalább egy .ctor kell lennie
5. A programozó nem tudja irányítani a .cctor hívás időzítését, bizonyos értelemben a programozó irányíthatja a hívás időzítését
6. A programozók nem hívhatják közvetlenül a .cctor-t, .ctor-t Ha a programozó az új operátort használja, a .ctor-t biztosan meghívják
.cctor hívás időzítése:
A statikus konstruktor automatikusan meghívódik, mielőtt az első példány létrejött vagy bármely statikus tagra hivatkoznának. (Ez az eredeti idézet az MSDN-en)
Egyértelmű, hogy a .cctor csak egyszer hívják meg ugyanabban a programtartományban, nem pedig minden alkalommal, amikor egy objektumot megidéznek, mint a .ctor-t,
.cctor használat
A statikus konstruktorokat használják bármilyen statikus adat inicializálására, vagy olyan konkrét műveletek végrehajtására, amelyeket csak egyszer kell végrehajtani.
Például:
Az alábbi kódok mind Windows 7-ben van fordítva, szemben a 2005-ös kiadás móddal, és ha az eredmény eltér, fontold meg a kiadási módra váltást, és újra próbálkozni
Fordítsd le ezt a kódszegmenst, majd használd az ILDISM-et a megtekintéshez, a metódustábla a következő
.ctor(): void // Ez egy példánykonstruktora az osztálynak, amelyet a fordító automatikusan biztosít
Main():void(string[]) //Program belépési pontja
Nyilvánvalóan nincs .cctor az assembly rendszerben, és a fordító nem ad automatikusan .cctor függvényeket, ha egy osztálynak nincs statikus mezője, amit inicializálni kell, ami eltér a .ctor-tól, amely amúgy is mindig létezik
A kód módosítása
A kód fordítása után figyelmeztetés lesz, de ez nem fontos, a lényeg, hogy amikor az assembly ILDASTOM-mal nézi meg, a várt .cctor, statikus konstruktor nem jelenik meg!
mi történt?
Téves-e a következtetés? A CCTOR nem egy statikus mező, amelyet egy osztály inicializálására használnak?
Nyugi, kérlek, nézd meg a kódot
Az egyetlen különbség a kód és az előző között az, hogy megváltoztatja a statikus mező i kezdeti értékét, és a következő lépés az, hogy tanúja legyen a varázslatos pillanatnak
Csináljuk meg DASM-ot, és meglepetésünkre végre megérkezett a nagyon kívánt .cctor!
Nézd meg a .cctor implementációs kódot, és látni fogod:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Kód mérete 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Statikus mezők megtestesítése :-) IL_0001: STSFLD int32 only_lonely. V::i IL_0006: ret. } // A módszer vége::.cctor
Miért van ez így? Lehetséges ok az, hogy az Int32 típus alapértelmezett értéke 0, és a fordító ezt érzékeli, valamint optimalizálja, hogy ne generáljon .cctor kódot
utalás
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Végül magunk is megvalósíthatunk egy .cctor függvényt, hogy speciális funkcionális követelményeket valósítsunk meg
összefoglalás 1、. a CTOR a szerkezeti módszer; 2、. a cctor egy típus-inicializátor, amely statikus konstruktor C#-ban; 3. Amikor C osztály megteremtik, először egy értéket rendel a deklaráció idején megadott mezőhöz, majd hívja az alaposztály konstruktorát, majd ugyanígy építi fel magát, egészen a felső szintű System.Object szintig, majd visszatér, hogy végrehajtsa a kódot a C explicit építési módszerében, ami egy ilyen rekurzív folyamat.
|