.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 по сравнению с режимом выпуска 2005 года, и если результаты отличаются, рассмотрите возможность переключения в режим выпуска и повторной попытки
Скомпилируйте этот сегмент кода и затем используйте ILDISM для просмотра, таблица методов выглядит следующим образом
.ctor(): void // Это конструктор экземпляра класса, автоматически предоставляемого компилятором
Main():void(string[]) //Точка входа в программу
Очевидно, что в ассемблере нет .cctor, и компилятор не будет автоматически предоставлять функции .cctor, если класс не содержит статических полей, требующих инициализации, что отличается от .ctor, который и так всегда существует
Изменить код
При компиляции этого кода появится предупреждение, но это не важно, главное, что при просмотре ассемблера с помощью ILDASTOM ожидаемый .cctor, статический конструктор не появляется!
Что случилось?
Ошибочен ли вывод? CCTOR не является статическим полем, используемым для инициализации класса?
Спокойно, пожалуйста, посмотрите на код
Единственное отличие этого кода от предыдущего в том, что он меняет начальное значение статического поля i, а следующее — стать свидетелем волшебного момента
Давайте сделаем DASM, и к нашему удивлению, долгожданный .cctor наконец-то здесь!
Посмотрите на код реализации .cctor, и вы увидите:
.метод private hidebysig specialname 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, который является таким рекурсивным процессом.
|