Итак, я с удовольствием читал this от Эрика Липперта, а затем, конечно, отличные комментарии и в них Джон Пейсон сказал:
более интересным примером могло бы быть использование двух статических классов, поскольку такая программа могла затормозить без каких-либо видимых операторов блокировки.
и я подумал, да, это было бы легко, поэтому я сбил это:
public static class A
{
static A()
{
Console.WriteLine("A.ctor");
B.Initialize();
Console.WriteLine("A.ctor.end");
}
public static void Initialize()
{
Console.WriteLine("A.Initialize");
}
}
public static class B
{
static B()
{
Console.WriteLine("B.ctor");
A.Initialize();
Console.WriteLine("B.ctor.end");
}
public static void Initialize()
{
Console.WriteLine("B.Initialize");
}
public static void Go()
{
Console.WriteLine("Go");
}
}
Выход которого (после вызова B.Go()
):
B.ctor
A.ctor
B.Initialize
A.ctor.end
A.Initialize
B.ctor.end
Go
Нет тупика, и я, очевидно, проигравший, поэтому, чтобы увековечить смущение, вот мой вопрос: почему здесь нет тупика?
Кажется моему маленькому мозгу, что B.Initialize
называется до, статический конструктор B
завершен, и я думал, что это не разрешено.