.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.
|