Skip to content

Instantly share code, notes, and snippets.

@eterekhin
Last active October 14, 2019 04:36
Show Gist options
  • Save eterekhin/664166dba83749f3bcd6e38d816b57a6 to your computer and use it in GitHub Desktop.
Save eterekhin/664166dba83749f3bcd6e38d816b57a6 to your computer and use it in GitHub Desktop.

Когда вызывается конструктор типа

Когда происходит первое обращение JIT компилятор к методу, который обращается к типу, CLR следит, чтобы вызов происходил только один раз Бывают ситуации, когда из статического конструктора типа идет обращение к другому типу, и CLR должна вызвать статический конструктор этого типа, лучше избегать таких ситуаций Также возможно обращение к конструктору типа из разных потоков одновременно, тогда на него накладывается блокировка, как только первый поток начал исполнение, остальные потоки откатываются и больше этот конструктор не вызывается, тем самым получаем, что конструктор типа реализует шаблон singleton, и в нем можно инициализировать поля, которые также должны соответсовать этому шаблону

Сколько раз вызывается конструктор типа

Один

Как в CLR представлен конструктор типа ( какие модификаторы доступа используются)

private,static - private явно указывает что он вызывается только CLR

Как вызвать статический конструктор класса вручную

Используя метод Runtime.Helpers,RunClassConstructor(TypeHandle t), этот метод вызывает конструктор типа, если он еще не был вызван

Когда типы уничтожаются

При выгрузке домена(завершении приложения), нет какого-то хука на уничтожение каждого типа (статического Finalize), только если использовать событие DomainUnload в System.AppDomain

Можно ли инлайн инициализировать какие-то поля структуры

Да, Рихтер пишет, что статический конструктор структуры никогда не вызывается, однако у меня он вызвался и статическое поле структуры было проинициализировано именно там

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment