Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 31028|Răspunde: 1

[Sursă] .ctor și .cctor din .net

[Copiază linkul]
Postat pe 06.04.2017 14:56:38 | | | |
.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.





Precedent:Obiecte generice legate de context: ContextBoundObject și clasele generice nu sunt suportate
Următor:Rezumat al ordinii de execuție a metodelor statice, nestatice și constructive într-o clasă
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com