.ctor ir zināms ikvienam
.cctor nav pazīstams un to var viegli izmantot ļaunprātīgi
Tā sauktais .cctor ir statisks konstruktors C# sintaksē
Forma kā
Līdzības un atšķirības starp .cctor un .ctor
1. Piekļuves tiesību identifikatori nevar būt publiski, privāti utt., kurus nevar izmantot, kas atšķiras no .ctor
2. Nedrīkst būt atgrieztās vērtības, kas ir tāda pati kā .ctor
3. Nevar būt parametru, .ctor var būt vairāki parametri
4. Var būt tikai viens, un jābūt vismaz vienam .ctor
5. Programmētājs nevar kontrolēt .cctor zvana laiku, savā ziņā programmētājs var kontrolēt tā izsaukuma laiku
6. Programmētāji nevar tieši izsaukt .cctor, .ctor Kad programmētājs izmanto jauno operatoru, noteikti tiks izsaukts .ctor
.cctor zvana laiks:
Statiskais konstruktors tiek automātiski izsaukts pirms pirmās instances izveides vai atsauces uz jebkuru statisku elementu. (Šis ir oriģinālais citāts MSDN)
Ir skaidrs, ka .cctor tiek izsaukts tikai vienu reizi vienā programmas domēnā, nevis tiek izsaukts katru reizi, kad objekts tiek instancēts, piemēram, .ctor
.cctor lietošana
Statiskie konstruktori tiek izmantoti, lai inicializētu statiskos datus vai veiktu noteiktas darbības, kas jāveic tikai vienu reizi.
Piemēram:
Viss tālāk norādītais kods tiek kompilēts Windows 7, salīdzinot ar 2005. gada izlaišanas režīmu, un, ja rezultāti atšķiras, apsveriet iespēju pārslēgties uz laidiena režīmu un mēģināt vēlreiz
Kompilējiet šo koda segmentu un pēc tam izmantojiet ILDISM, lai to apskatītu, metodes tabula ir šāda
.ctor(): void // Šis ir kompilatora automātiski nodrošinātās klases instances konstruktors
main():void(string[]) //Programmas ieejas punkts
Acīmredzot montāžā nav .cctor, un kompilators automātiski nenodrošinās .cctor funkcijas, ja klasei nav statisku lauku, kas jāinicializē, kas atšķiras no .ctor, kas vienmēr pastāv
Koda modificēšana
Sastādot šo kodu, būs brīdinājums, bet tas nav svarīgi, svarīgi ir tas, ka, apskatot montāžu ar ILDASTOM, neparādās paredzamais .cctor, statiskais konstruktors!
Kas noticis?
Vai secinājums ir nepareizs?. CCTOR nav statisks lauks, ko izmanto klases inicializēšanai?
Ņemiet to mierīgi, lūdzu, apskatiet kodu
Vienīgā atšķirība starp šo kodu un iepriekšējo ir tā, ka tas maina statiskā lauka i sākotnējo vērtību, un nākamā lieta ir redzēt maģisko brīdi
DASM to, un mums par pārsteigumu, ļoti pieprasītais .cctor beidzot ir klāt!
Apskatiet .cctor ieviešanas kodu un redzēsiet:
.method private hidebysig specialname rtspecialname static void .cctor() cil pārvaldīts
{ Koda izmērs 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Instancēt statiskos laukus :-) IL_0001: stsfld int32 only_lonely. A::i IL_0006: ret } // A metodes beigas::.cctor
Kāpēc tas tā ir? Iespējamais iemesls ir tas, ka Int32 tipa noklusējuma vērtība ir 0, un kompilators to atklāj un optimizē, lai neradītu .cctor kodu
Atsauce
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Visbeidzot, mēs paši varam ieviest .cctor funkciju, lai īstenotu īpašas funkcionālās prasības
Kopsavilkuma 1、. CTOR ir būvniecības metode; 2、. cctor ir tipa inicializators, kas ir statisks konstruktors C#; 3. Kad C klase tiek instancēta, tā vispirms piešķirs vērtību laukam, kas tiek piešķirts deklarēšanas brīdī, un pēc tam izsauc bāzes klases konstruktoru un pēc tam veido sevi tādā pašā veidā līdz augstākā līmeņa System.Object, un pēc tam atgriezīsies, lai izpildītu kodu C skaidrās konstrukcijas metodē, kas ir šāds rekursīvs process.
|