Я разрабатываю CLI для конкретного домена, и в течение последних двух недель я изучал различные угловые случаи, чтобы убедиться, что у меня есть четкое понимание того, что требуется.
Сейчас я смотрю на типовую конструкцию. Я рассматриваю следующий сценарий, о котором я не могу найти много информации о:
class C
{
public static int Field = D.Field;
}
class D
{
public static int Field = C.Field;
}
class TestProg
{
static void Main()
{
Console.WriteLine( D.Field );
}
}
Оба класса отмечены beforefieldinit
.
Интересно, что эта программа действительно компилируется и работает на MSCLR, что дает:
0
Итак, похоже, что на практике происходит то, что триггерная точка в C..cctor
для построения D
игнорируется, поскольку конструкция D
уже началась. Однако для меня эта программа выглядит недействительной, в том смысле, что C..cctor
использует что-то до того, как она будет полностью построена.
Многие укажут, что приведенный выше сценарий бессмысленен, но для меня это является проблемой как разработчик CLI, потому что мне нужно знать, какая широта я имею в отношении циклических ссылок в инициализаторах типа.
Все, что я могу найти в ECMA-335, это:
Если вы отметили BeforeFieldInit, то метод инициализации типов запускается или когда-то раньше имеет доступ к любому статическому полю, определенному для этого типа.
Слова "выполняются при" оставляют в этом случае некоторую двусмысленность, потому что они не указывают, должен ли выполняться весь инициализатор или нужно просто начать выполнение.
Я столкнулся с комментарием, относящимся к конкретным правилам в спецификациях CLI о круговом справочном примере, но до сих пор я вообще не мог найти упоминания об этой проблеме в ECMA-335.
Итак, мои вопросы:
-
Является ли вышеприведенная программа полагающейся на поведение undefined? Или неуказанное поведение?
-
Если мой CLR отказался загружать вышеуказанную программу, будет ли он по-прежнему соответствовать требованиям?
-
Если нет, то каковы точные правила о круговых ссылках в конструкторах типов?
-
Существуют ли какие-либо допустимые полезные шаблоны проектирования, которые могут приводить к циклам в ориентированном графе инициализаторов типа программы при дисконтировании управления потоком?