Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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 по сравнению с режимом выпуска 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, который является таким рекурсивным процессом.





Предыдущий:Общие контекстно-ограниченные объекты: ContextBoundObject и общие классы не поддерживаются
Следующий:Краткое изложение порядка выполнения статических, нестатических и конструктивных методов в классе
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com