.ctor este cunoscut de toată lumea
.cctor nu este familiar și poate fi ușor folosit greșit
Așa-numitul .cctor este un constructor static în sintaxa C#
Formă ca
Asemănări și diferențe între .cctor și .ctor
1. Nu poți avea identificatori de drepturi de acces publici, private etc., care nu pot fi folosiți, ceea ce este diferit de .ctor
2. Nu trebuie să existe o valoare de returnare, care este aceeași cu .ctor
3. Nu pot exista parametri, .ctor poate avea mai mulți parametri
4. Poate exista cel mult unul, și trebuie să existe cel puțin un .ctor
5. Programatorul nu poate controla momentul apelului .cctor, într-un anumit sens, poate controla momentul apelului său
6. Programatorii nu pot chema direct .cctor, .ctor Când programatorul folosește noul operator, .ctor va fi cu siguranță apelat
Sincronizarea apelului .cctor:
Constructorul static este apelat automat înainte ca prima instanță să fie creată sau înainte ca orice membru static să fie referențiat. (Acesta este citatul original de pe MSDN)
Este clar că .cctor este apelat o singură dată în același domeniu de program, nu de fiecare dată când un obiect este instanțiat, așa cum este .ctor
.cctor utilizare
Constructoarele statice sunt folosite pentru a inițializa orice date statice sau pentru a efectua operații specifice care trebuie efectuate o singură dată.
De exemplu:
Tot codul următor este compilat în Windows 7, față de modul 2005 Release, iar dacă rezultatele sunt diferite, ia în considerare trecerea în modul release și încercarea din nou
Compilați acest segment de cod și apoi folosiți ILDISM pentru a-l vizualiza, tabelul metodelor este următorul
.ctor(): void // Acesta este un constructor de instanță al clasei furnizate automat de compilator
Main():void(string[]) //Punct de intrare în program
Evident, nu există .cctor în asamblare, iar compilatorul nu va furniza automat funcții .cctor atunci când o clasă nu are câmpuri statice care trebuie inițializate, ceea ce este diferit de .ctor, care oricum există întotdeauna
Modifică codul
La compilarea acestui cod, va apărea un avertisment, dar acesta nu este important, important este că atunci când vizualizezi asamblarea cu ILDASTOM, .cctor-ul așteptat, constructorul static, nu apare!
ce s-a întâmplat?
Este inferența greșită? CCTOR nu este un câmp static folosit pentru a inițializa o clasă?
Calmează-te, te rog să te uiți la cod
Singura diferență dintre acest cod și cel anterior este că schimbă valoarea inițială a câmpului static i, iar următorul pas este să asisti la momentul magic
Hai să-l DASM, iar spre surprinderea noastră, mult solicitatul .cctor este în sfârșit aici!
Uită-te la codul de implementare .cctor și vei vedea:
.method private hidebysig nume special, rtspecialname, static void .cctor() cil managed
{ Dimensiunea codului 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instanțiază câmpurile statice :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // sfârșitul metodei A::.cctor
De ce este așa? Motivul posibil este că valoarea implicită a tipului Int32 este 0, iar compilatorul detectează acest lucru și îl optimizează astfel încât să nu producă cod .cctor
referință
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
În final, putem implementa noi înșine o funcție .cctor pentru a implementa cerințe funcționale speciale
rezumat 1、. CTOR este metoda de construcție; 2、. cctor este un inițializator de tipuri, care este un constructor static în C#; 3. Când clasa C este instanțiată, aceasta va atribui mai întâi o valoare câmpului atribuit la momentul declarației, apoi va chema constructorul clasei de bază, apoi se va construi în același mod, până la System.Object de nivel superior, și apoi va reveni pentru a executa codul în metoda explicită de construcție a lui C, care este un astfel de proces recursiv.
|