Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 31028|Svar: 1

[Kilde] .ctor og .cctor af .net

[Kopier link]
Opslået på 06/04/2017 14.56.38 | | | |
.ctor er kendt af alle

.cctor er ikke velkendt og kan let misbruges

Den såkaldte .cctor er en statisk konstruktør i C#-syntaks

Formlignende




Ligheder og forskelle mellem .cctor og .ctor

   1. Du kan ikke have adgangsrettighedsidentitegnere offentlige, private osv., som ikke kan bruges, hvilket er forskelligt fra .ctor

   2. Der må ikke være nogen returværdi, som er den samme som .ctor

   3. Der kan ikke være parametre, .ctor kan have flere parametre

   4. Der kan højst være én, og der skal være mindst én .ctor.

   5. Programmøren kan ikke kontrollere timingen af .cctor-kaldet; på en måde kan programmøren styre timingen af sit kald

   6. Programmører kan ikke direkte kalde .cctor, .ctor Når programmøren bruger den nye operator, vil .ctor helt sikkert blive kaldt


.cctor-opkaldstidspunkt:


    Den statiske konstruktør kaldes automatisk, før den første instans oprettes eller et statisk medlem refereres. (Dette er det oprindelige citat på MSDN)

    Det er klart, at .cctor kun kaldes én gang i samme programdomæne, i stedet for at blive kaldt hver gang et objekt instansieres, som .ctor

.cctor-brug

    Statiske konstruktører bruges til at initialisere statiske data eller til at udføre specifikke operationer, der kun behøver at udføres én gang.


For eksempel:

Al den følgende kode er kompileret i Windows 7 i modsætning til 2005 Release mode, og hvis resultaterne er anderledes, kan du overveje at skifte til release mode og prøve igen




Kompiler dette kodesegment og brug derefter ILDISM til at se det, metodetabellen er som følger



.ctor(): void // Dette er en instanskonstruktør af klassen, som compileren automatisk leverer,

Main():void(string[]) //Program entry point

Selvfølgelig er der ingen .cctor i assemblyen, og compileren vil ikke automatisk levere .cctor-funktioner, når en klasse ikke har statiske felter, der skal initialiseres, hvilket er forskelligt fra .ctor, som alligevel altid eksisterer

Ændr koden




Når jeg kompilerer denne kode, vil der være en advarsel, men det er ikke vigtigt, det vigtige er, at når man ser assemblyen med ILDASTOM, vises den forventede .cctor, statiske konstruktør ikke!


Hvad skete der?

Er slutningen forkert? CCTOR er ikke et statisk felt, der bruges til at initialisere en klasse?

Tag det roligt, kig venligst på koden





Den eneste forskel mellem denne kode og den forrige er, at den ændrer den oprindelige værdi af det statiske felt i, og det næste er at være vidne til det magiske øjeblik

Lad os DAM det, og til vores overraskelse er den meget efterspurgte .cctor endelig her!



Se på .cctor-implementeringskoden, og du vil se:

.metode privat hidebysig specialnavn rtspecialname statisk
        void .cctor() cil managed
{
  Kodestørrelse 7 (0x7)
  .maxstack 8
  IL_0000: ldc.i4.1 // Instansier statiske felter :-)
  IL_0001: Stsfld int32 only_lonely. A::i
  IL_0006: ret
} // slut på metode A::.cctor


Hvorfor er det sådan? Den mulige grund er, at standardværdien for Int32-typen er 0, og compileren registrerer dette og optimerer det, så den ikke producerer .cctor-kode

henvisning
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx

Endelig kan vi selv implementere en .cctor-funktion for at implementere særlige funktionelle krav

resumé
1、. CTOR er konstruktionsmetoden;
2、. cctor er en typeinitializer, som er en statisk konstruktør i C#;
3. Når klasse C instansieres, vil den først tildele en værdi til feltet, der er tildelt ved deklarationstidspunktet, og derefter kalde konstruktøren af basisklassen, og derefter konstruere sig selv på samme måde, hele vejen til topniveauet System.Object, og derefter vende tilbage for at udføre koden i C's eksplicitte konstruktionsmetode, som er en så rekursiv proces.





Tidligere:Generiske kontekstbundne objekter: ContextBoundObject og generiske klasser understøttes ikke
Næste:Sammenfatning af eksekveringsrækkefølgen for statiske, ikke-statiske og konstruktive metoder i en klasse
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com