Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 31028|Odpowiedź: 1

[Źródło] .ctor i .cctor z .net

[Skopiuj link]
Opublikowano 06.04.2017 14:56:38 | | | |
.ctor jest znany wszystkim

.cctor nie jest znany i łatwo go niewłaściwie używać

Tak zwany .cctor to statyczny konstruktor w składni C#

Kształt jak




Podobieństwa i różnice między .cctor a .ctor

   1. Nie możesz mieć identyfikatorów praw dostępu publicznych, prywatnych itd., których nie można używać, co różni się od .ctor

   2. Nie może istnieć wartość zwrotu, która jest taka sama jak .ctor

   3. Nie może być parametrów, .ctor może mieć wiele parametrów

   4. Może być maksymalnie jeden i musi istnieć co najmniej jeden .ctor

   5. Programista nie może kontrolować czasu wywołania .cctor, w pewnym sensie może kontrolować czas wywołania

   6. Programiści nie mogą bezpośrednio wywoływać .cctor, .ctor Gdy programista używa nowego operatora, .ctor zostanie na pewno wywołany


.cctor – godziny wywołań:


    Konstruktor statyczny jest automatycznie wywoływany przed utworzeniem pierwszej instancji lub odwołaniem się do jakiegokolwiek statycznego członka. (To jest oryginalny cytat na MSDN)

    Jasne jest, że .cctor jest wywoływany tylko raz w tej samej domenie programu, a nie wywoływany za każdym razem, gdy obiekt jest instancjonowany, jak .ctor

.cctor użycie

    Konstruktory statyczne są używane do inicjalizacji danych statycznych lub do wykonywania konkretnych operacji, które trzeba wykonać tylko raz.


Na przykład:

Cały poniższy kod jest skompilowany w Windows 7, a nie w trybie 2005, a jeśli wyniki są inne, rozważ przełączenie na tryb release i ponowną próbę




Skompiluj ten fragment kodu, a następnie użyj ILDISM, aby go zobaczyć, tabela metod wygląda następująco



.ctor(): void // To jest konstruktor instancji klasy automatycznie dostarczany przez kompilator

Main():void(string[]) //Punkt wejścia programu

Oczywiście w asemblerze nie ma pliku .cctor, a kompilator nie udostępni automatycznie funkcji .cctor, gdy klasa nie ma statycznych pól wymagających inicjalizacji, co różni się od .ctor, który i tak zawsze istnieje

Modyfikacja kodu




Kompilując ten kod, pojawi się ostrzeżenie, ale to nie jest istotne, ważne jest, że podczas przeglądania asembla w ILDASTOM, oczekiwany konstruktor statyczny .cctor się nie pojawia!


Co się stało?

Czy wnioskowanie jest błędne? CCTOR to nie jest statyczne pole używane do inicjalizacji klasy?

Spokojnie, proszę, spójrz na kod





Jedyną różnicą między tym kodem a poprzednim jest to, że zmienia wartość początkową pola statycznego i, a następnym krokiem jest obserwowanie magicznego momentu

Zróbmy to DASM, a ku naszemu zaskoczeniu, wyczekiwany .cctor w końcu się pojawił!



Spójrz na kod implementacyjny .cctor i zobaczysz:

.method private hidebysig specialname rtspecialname static
        void .cctor() cil managed
{
  Rozmiar kodu 7 (0x7)
  .maxstack 8
  IL_0000: ldc.i4.1 // Utworzenie statycznych pól :-)
  IL_0001: stsfld int32 only_lonely. O::i
  IL_0006: wycofany
} // koniec metody A::.cctor


Dlaczego tak jest? Możliwym powodem jest to, że domyślna wartość typu Int32 wynosi 0, a kompilator to wykrywa i optymalizuje tak, aby nie generować kodu .cctor

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

Wreszcie, możemy sami zaimplementować funkcję .cctor, aby zrealizować specjalne wymagania funkcjonalne

streszczenie
1、. CTOR to metoda konstrukcyjna;
2、. cctor to inicjalizator typów, który jest statycznym konstruktorem w języku C#;
3. Gdy klasa C zostanie instancjonowana, najpierw przypisze wartość polu przypisanemu w momencie deklaracji, następnie wywoła konstruktora klasy bazowej, a następnie konstruuje się w ten sam sposób, aż do najwyższego poziomu System.Object, a następnie wraca, aby wykonać kod w jawnej metodzie konstrukcyjnej C, która jest takim procesem rekurencyjnym.





Poprzedni:Ogólne obiekty powiązane z kontekstem: ContextBoundObject i klasy generyczne nie są obsługiwane
Następny:Podsumowanie kolejności wykonywania metod statycznych, niestatycznych i konstruktywnych w klasie
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com