Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 31028|Відповідь: 1

[Джерело] .ctor та .cctor для .net

[Копіювати посилання]
Опубліковано 06.04.2017 14:56:38 | | | |
.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, який є таким рекурсивним процесом.





Попередній:Загальні контекстно-обмежені об'єкти: ContextBoundObject і загальні класи не підтримуються
Наступний:Підсумок порядку виконання статичних, нестатичних і конструктивних методів у класі
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com