Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 31028|Svare: 1

[Kilde] .ctor og .cctor i .NET

[Kopier lenke]
Publisert på 06.04.2017 14:56:38 | | | |
.ctor er kjent for alle

.cctor er ikke kjent og kan lett misbrukes

Den såkalte .cctor-en er en statisk konstruktør i C#-syntaksen

Formlignende




Likheter og forskjeller mellom .cctor og .ctor

   1. Du kan ikke ha tilgangsrettighetsidentifikatorer offentlig, privat osv., som ikke kan brukes, noe som er forskjellig fra .ctor

   2. Det må ikke finnes noen returverdi, som er det samme som .ctor

   3. Det kan ikke finnes parametere, .ctor kan ha flere parametere

   4. Det kan maksimalt være én, og det må være minst én .ctor

   5. Programmereren kan ikke kontrollere tidspunktet for .cctor-kallet, på en måte kan programmereren kontrollere tidspunktet for kallet

   6. Programmerere kan ikke direkte kalle .cctor, .ctor Når programmereren bruker den nye operatoren, vil .ctor definitivt bli kalt


.cctor-anropstidspunkt:


    Den statiske konstruktøren kalles automatisk før den første instansen opprettes eller et statisk medlem refereres. (Dette er det opprinnelige sitatet på MSDN)

    Det er klart at .cctor kun kalles én gang i samme programdomene, i stedet for å bli kalt hver gang et objekt instansieres, slik som .ctor

bruk av .cctor

    Statiske konstruktører brukes til å initialisere statiske data, eller til å utføre spesifikke operasjoner som bare trenger å utføres én gang.


For eksempel:

All følgende kode er kompilert i Windows 7, i motsetning til 2005 Release Mode, og hvis resultatene er forskjellige, vurder å bytte til release mode og prøve igjen




Kompil dette kodesegmentet og bruk deretter ILDISM for å vise det, metodetabellen er som følger



.ctor(): void // Dette er en instanskonstruktør av klassen som automatisk gis av kompilatoren

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

Selvfølgelig finnes det ingen .cctor i assembleren, og kompilatoren vil ikke automatisk tilby .cctor-funksjoner når en klasse ikke har statiske felt som må initialiseres, noe som er forskjellig fra .ctor, som uansett alltid eksisterer

Endre koden




Når jeg kompilerer denne koden, vil det komme en advarsel, men det er ikke viktig, det viktige er at når man ser på assemblyen med ILDASTOM, vises ikke den forventede .cctor, statiske konstruktøren!


hva har skjedd?

Er slutningen feil? Er ikke CCTOR et statisk felt som brukes til å initialisere en klasse?

Ta det med ro, vennligst ta en titt på koden





Den eneste forskjellen mellom denne koden og den forrige er at den endrer startverdien til det statiske feltet i, og det neste er å være vitne til det magiske øyeblikket

La oss bruke DASM, og til vår overraskelse er den etterspurte .cctor-en endelig her!



Se på .cctor-implementasjonskoden, så vil du se:

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


Hvorfor er det slik? Den mulige grunnen er at standardverdien for Int32-typen er 0, og kompilatoren oppdager dette og optimaliserer det slik at det ikke produserer .cctor-kode

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

Til slutt kan vi selv implementere en .cctor-funksjon for å implementere spesielle funksjonelle krav

sammendrag
1、. CTOR er konstruksjonsmetoden;
2、. cctor er en typeinitialisator, som er en statisk konstruktør i C#;
3. Når klasse C instansieres, vil den først tildele en verdi til feltet som er tildelt ved deklarasjonstidspunktet, og deretter kalle konstruktøren av basisklassen, og deretter konstruere seg selv på samme måte, helt til toppnivået System.Object, og så komme tilbake for å kjøre koden i C sin eksplisitte konstruksjonsmetode, som er en så rekursiv prosess.





Foregående:Generiske kontekstbundne objekter: ContextBoundObject og generiske klasser støttes ikke
Neste:Oppsummering av utførelsesrekkefølgen for statiske, ikke-statiske og konstruktive metoder i en klasse
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com