.ctor on kaikkien tuntema
.cctor ei ole tuttu ja sitä voidaan helposti käyttää väärin
Niin kutsuttu .cctor on staattinen konstruktori C#-syntaksissa
Muoto
Samankaltaisuudet ja erot .cctorin ja .ctorin välillä
1. Et voi käyttää käyttöoikeustunnisteita julkisina, yksityisinä jne., joita ei voi käyttää, mikä eroaa .ctorista
2. Palautusarvoa ei saa olla, mikä on sama kuin .ctorilla
3. Parametreja ei voi olla, .ctorilla voi olla useita parametreja
4. Enintään yksi voi olla yksi, ja vähintään yksi .ctor
5. Ohjelmoija ei voi hallita .cctor-kutsun ajoitusta, ohjelmoija voi tavallaan ohjata kutsun ajoitusta
6. Ohjelmoijat eivät voi kutsua suoraan .cctor- tai .ctor-tiedostoja Kun ohjelmoija käyttää uutta operaattoria, .ctor kutsutaan varmasti
.CCTOR-puhelun ajoitus:
Staattinen konstruktori kutsutaan automaattisesti ennen kuin ensimmäinen instanssi luodaan tai mihin tahansa staattiseen jäseneen viitataan. (Tämä on alkuperäinen lainaus MSDN:llä)
On selvää, että .cctor kutsutaan vain kerran samassa ohjelmadomainissa, eikä sitä kutsuta aina, kun objekti instansoidaan kuten .ctor.
.cctor-käyttö
Staattisia konstruktoreita käytetään minkä tahansa staattisen datan alustamiseen tai tiettyjen toimintojen suorittamiseen, jotka tarvitsee suorittaa vain kerran.
Esimerkiksi:
Kaikki seuraava koodi on käännetty Windows 7:ssä verrattuna vuoden 2005 julkaisutilaan, ja jos tulokset ovat erilaiset, harkitse siirtymistä julkaisutilaan ja kokeile uudelleen
Käännä tämä koodisegmentti ja käytä ILDISM:ää sen tarkasteluun, metoditaulu on seuraava
.ctor(): void // Tämä on luokan instanssikonstruktori, jonka kääntäjä tarjoaa automaattisesti
Main():void(string[]) //Ohjelman aloituspiste
On selvää, että assemblerissa ei ole .cctor-tiedostoa, eikä kääntäjä automaattisesti tarjoa .cctor-funktioita, kun luokassa ei ole staattisia kenttiä, jotka täytyy alustaa, mikä eroaa .ctorista, joka on joka tapauksessa aina olemassa
Muokkaa koodia
Kun käännän tätä koodia, tulee varoitus, mutta se ei ole tärkeää, tärkeintä on, että kun katsoo assemblyä ILDASTOMilla, odotettua .cctor-staattista rakentajaa ei näy!
Mitä tapahtui?
Onko johtopäätös väärä?. Eikö CCTOR ole staattinen kenttä, jota käytetään luokan alustumiseen?
Ota rauhallisesti, katso koodia
Ainoa ero tämän koodin ja edellisen välillä on, että se muuttaa staattisen kentän i alkuarvoa, ja seuraavaksi nähdään taikahetki
Tehdään DASM, ja yllätykseksemme paljon toivottu .cctor on vihdoin täällä!
Katso .cctor-toteutuskoodia ja näet:
.method private hidebysig specialname rtspecialname static void .cctor() cil managed
{ Koodikoko 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Staattiset kentät :-) IL_0001: stsfld int32 only_lonely. V::i IL_0006: jää } // metodin A::.cctor loppu
Miksi näin on? Mahdollinen syy on se, että Int32-tyypin oletusarvo on 0, ja kääntäjä havaitsee tämän ja optimoi sen niin, ettei tuota .cctor-koodia
viittaus
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Lopuksi voimme toteuttaa .cctor-funktion itse toteuttaaksemme erityisiä funktionaalisia vaatimuksia
yhteenveto 1、. CTOR on rakennusmenetelmä; 2、. cctor on tyyppialusto, joka on staattinen konstruktori C#:ssa; 3. Kun luokka C instansoituu, se antaa ensin arvon kentälle, joka on määritelty määrityksen hetkellä, ja kutsuu sitten perusluokan konstruktorin, ja rakentaa itsensä samalla tavalla aina ylimmälle tasolle System.Object, ja palaa sitten suorittamaan koodin C:n eksplisiittisessä rakennusmenetelmässä, joka on niin rekursiivinen prosessi.
|