Стратегия встраивания джиттера - это деталь реализации, которая может быть изменена в любое время, поэтому практически нет никаких гарантий относительно того, что может или не может быть встроено.
Сказав это, трудночтобы увидеть, как статический конструктор может быть безопасно встроен, принимая во внимание гарантии, предоставляемые спецификациями C # и CLI относительно статических конструкторов и инициализации типов.
Из спецификации Microsoft C # (раздел10.12):
Статический конструктор для закрытого типа класса выполняется не более одного раза в данной области приложения.Выполнение статического конструктора инициируется первым из следующих событий, происходящих в домене приложения:
- Создается экземпляр типа класса.
- Любой из статическихссылки на члены типа класса.
И из спецификации ECMA CLI (раздел 8.9.5):
[Aclass может] необязательно указывать метод (называемый .cctor
), который будет вызываться для инициализации типа.
Семантика того, когда и что запускает выполнение таких методов инициализации типа, следующая:
- Тип может иметь метод инициализатора типа или нет.
Тип можно указать как имеющий смягченную семантику для его метода инициализатора типа (для удобства ниже мы называем эторасслабленная семантика BeforeFieldInit ).
Если помечено BeforeFieldInit , то метод инициализатора типа выполняется во время или ранее при первом доступе к любому статическому полю, определенному fили этот тип.
Если не отмечен BeforeFieldInit , то метод инициализатора этого типа выполняется в (т. е. инициируется):
- первый доступ к любой статическойполе этого типа, либо
- первый вызов любого статического метода этого типа, либо
- первый вызов любого экземпляра или виртуального метода этого типа, если это тип значения, либо
- первый вызов любого конструктора для этого типа.
(Обратите внимание, что классы C # со статическим конструктором не будут иметь семантику beforefieldinit
.Классы C # без статического конструктора будут иметь beforefieldinit
семантику.)