Я не верю, что сгенерированный код проверял бы, был ли класс инициализирован каждый раз, когда он обращается к статическому члену (который включает в себя функции). Я считаю, что проверка каждого доступа была бы неэффективной. Я посмотрел на §17.11 в ECMA 334, и он говоритКак C# знает, когда запускать статический конструктор?
Выполнение статического конструктора вызывается первым из следующих событий происходит в домене приложения:
- Экземпляр класс создается.
- Ссылка на любой из статических членов класса.
Похоже, что выяснить, когда происходит «первое», не определено. Я не могу придумать, как это сделать, но проверять каждый раз. Как это можно сделать?
Связанный, для статического случая: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx - нетривиальный –
Разве это не вопрос установки указателя функции в другое место после первого вызов? Сначала он указывает на загрузчик классов или что-то еще, а затем в теле функции ... – user1096188
@Marc: Это обсуждается при вызове статического конструктора ПЕРЕД первым доступом к статическому члену, а не с тем, как обнаружен первый доступ , –