.ctor е познат на всички
.cctor не е познат и лесно може да се използва неправилно
Т.нар. .cctor е статичен конструктор в синтаксиса на C#
Форма като
Прилики и разлики между .cctor и .ctor
1. Не можеш да имаш идентификатори за права на достъп публични, частни и т.н., които не могат да се използват, което е различно от .ctor
2. Не трябва да има връщана стойност, която е същата като .ctor
3. Не може да има параметри, .ctor може да има множество параметри
4. Може да има само един най-много и трябва да има поне един .ctor
5. Програмистът не може да контролира времето на .cctor повикването, в известен смисъл програмистът може да контролира времето на повикването си
6. Програмистите не могат директно да извикат .cctor, .ctor Когато програмистът използва новия оператор, .ctor със сигурност ще бъде извикан
.cctor тайминг:
Статичният конструктор се извиква автоматично преди да бъде създаден първият инстанция или да се реферира статичен член. (Това е оригиналният цитат в MSDN)
Ясно е, че .cctor се извиква само веднъж в същия програмен домейн, вместо да се призовава всеки път, когато обект се инстанцира, като .ctor
.cctor употреба
Статичните конструктори се използват за инициализация на статични данни или за изпълнение на специфични операции, които трябва да се изпълнят само веднъж.
Например:
Целият следващ код е компилиран в Windows 7, а не в Release режим 2005, и ако резултатите са различни, помислете да превключите в режим на издание и да опитате отново
Компилирай този сегмент от кода и след това използвай ILDISM, за да го видиш, таблицата с методи е следната
.ctor(): void // Това е конструктор на екземпляр на класа, предоставен автоматично от компилатора
Main():void(string[]) //Входна точка на програмата
Очевидно няма .cctor в асемблера и компилаторът няма автоматично да предоставя .cctor функции, когато класът няма статични полета, които трябва да бъдат инициализирани, което е различно от .ctor, който така или иначе винаги съществува
Модифицирай кода
При компилиране на този код ще има предупреждение, но това не е важно, важното е, че при преглед на асемблера с ILDASTOM, очакваният .cctor, статичен конструктор не се появява!
Какво се случи?
Грешен ли е изводът? CCTOR не е статично поле, използвано за инициализация на клас?
Спокойно, моля, погледнете кода.
Единствената разлика между този код и предишния е, че той променя началната стойност на статичното поле i, а следващото нещо е да станеш свидетел на магическия момент
Нека го DASM-им и за наша изненада, дългоочакваният .cctor най-накрая е тук!
Погледнете кода за имплементация на .cctor и ще видите:
.метод частен hidebysig специално име rtspecialname static void .cctor() cil управляван
{ Размер на код 7 (0x7) .maxstack 8 IL_0000: ldc.i4.1 // Инстанцирай статични полета :-) IL_0001: STSFLD int32 only_lonely. A::i IL_0006: пенсиониране } // край на метода A::.cctor
Защо е така? Възможната причина е, че стандартната стойност на типа Int32 е 0 и компилаторът я открива и го оптимизира така, че да не произвежда .cctor код.
препратка
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx
Накрая, можем сами да реализираме .cctor функция, за да приложим специални функционални изисквания
резюме 1、. CTOR е методът на конструиране; 2、. cctor е инициализатор на типове, който е статичен конструктор в C#; 3. Когато клас C е инстанциран, първо ще присвои стойност на полето, което е присвоено в момента на обявяване, след това ще извика конструктора на базовия клас и след това ще се конструира по същия начин, чак до най-горното ниво System.Object, и след това ще се върне да изпълни кода в експлицитния метод на конструиране на C, който е толкова рекурсивен процес.
|