.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, і ви побачите:
.method private 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: ret } // кінець методу 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, який є таким рекурсивним процесом.
|