.ctor è conosciuto da tutti
.cctor non è familiare e può essere facilmente usato in modo errato
Il cosiddetto .cctor è un costruttore statico nella sintassi C#
Forma come
Somiglianze e differenze tra .cctor e .ctor
1. Non puoi avere identificatori di diritti di accesso pubblici, privati, ecc., che non possono essere usati, il che è diverso da .ctor
2. Non deve esserci alcun valore di ritorno, che è lo stesso di .ctor
3. Non possono esserci parametri, .ctor può avere più parametri
4. Al massimo può essercene uno, e deve esserci almeno un .ctor
5. Il programmatore non può controllare il timing della chiamata .cctor, in un certo senso, può controllare il timing della chiamata
6. I programmatori non possono chiamare direttamente .cctor, .ctor Quando il programmatore utilizza il nuovo operatore, .ctor verrà sicuramente chiamato
Temporizzazione delle chiamate .cctor:
Il costruttore statico viene chiamato automaticamente prima che venga creata la prima istanza o prima che venga riferito qualsiasi membro statico. (Questa è la citazione originale su MSDN)
È chiaro che .cctor viene chiamato una sola volta nello stesso dominio di programma, invece di essere chiamato ogni volta che un oggetto viene istanziato come .ctor
Uso di .cctor
I costruttori statici sono utilizzati per inizializzare qualsiasi dato statico o per eseguire operazioni specifiche che devono essere eseguite una sola volta.
Per esempio:
Tutto il codice seguente è compilato in modalità Windows 7, rispetto a Release 2005, e se i risultati sono diversi, considera di passare alla modalità release e riprovare
Compila questo segmento di codice e poi usa ILDISM per visualizzarlo, la tabella dei metodi è la seguente
.ctor(): void // Questo è un costruttore di istanza della classe fornita automaticamente dal compilatore
Main():void(string[]) //Punto di ingresso del programma
Ovviamente, non c'è .cctor nell'assembly, e il compilatore non fornirà automaticamente funzioni .cctor quando una classe non ha campi statici da inizializzare, il che è diverso da .ctor, che esiste sempre comunque
Modifica il codice
Compilando questo codice ci sarà un avviso, ma non è importante, la cosa importante è che quando si visualizza l'assembly con ILDASTOM, il .cctor atteso, il constructor statico non appare!
Cos'è successo?
L'inferenza è sbagliata? CCTOR non è un campo statico usato per inizializzare una classe?
Calmati, per favore dai un'occhiata al codice
L'unica differenza tra questo codice e il precedente è che cambia il valore iniziale del campo statico i, e la cosa successiva è assistere al momento magico
Facciamolo DASM, e con nostra sorpresa, il tanto richiesto .cctor è finalmente arrivato!
Guarda il codice di implementazione di .cctor e vedrai:
.method private hidebysig nome speciale rtspecialname static void .cctor() cil managed
{ Dimensione del codice 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Istanza campi statici :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // fine del metodo A::.cctor
Perché succede questo? La possibile ragione è che il valore predefinito del tipo Int32 è 0, e il compilatore lo rileva e lo ottimizza per non produrre codice .cctor
riferimento
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Infine, possiamo implementare noi stessi una funzione .cctor per implementare requisiti funzionali speciali
sommario 1、. CTOR è il metodo di costruzione; 2、. cctor è un inizializzatore di tipo, che è un costruttore statico in C#; 3. Quando la classe C viene istanziata, prima assegnerà un valore al campo assegnato al momento della dichiarazione, poi chiamerà il costruttore della classe base, e infine si costruirà allo stesso modo, fino al System.Object di livello superiore, e poi tornerà a eseguire il codice nel metodo di costruzione esplicita di C, che è un processo ricorsivo di questo tipo.
|