Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 31028|Risposta: 1

[Fonte] .ctor e .cctor di .net

[Copiato link]
Pubblicato su 06/04/2017 14:56:38 | | | |
.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.





Precedente:Oggetti generici legati al contesto: ContextBoundObject e le classi generiche non sono supportate
Prossimo:Riassunto dell'ordine di esecuzione dei metodi statici, non statici e costruttivi in una classe
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com