Потоковая безопасность статических инициализаторов в C #

Все говорят, что статические инициализаторы поточнобезопасны, но меня беспокоит конкретная деталь.

Допустим, у меня есть

static class MyStaticClass
{
    public static readonly object myField = MyOtherClass.GetNewObject();
}

static class MyOtherClass
{
    public static object GetNewObject()
    { /* arbitrary code that returns a new object */ }
}

Что из нижеперечисленного гарантирует C #, когдаMyStaticClass.myField еще не инициализирован?

Если потоки 1 и 2 пытаются получить доступmyField вместе (в таком порядке),GetNewObject буду иметьначалось выполнение до чтения потока 2myField.

Если потоки 1 и 2 пытаются получить доступmyField вместе (в таком порядке),GetNewObject буду иметьзаконченный выполнение до чтения потока 2myField.

Как насчет CLR в целом: если его гарантии отличаются от C #, чем они отличаются?
Изменилось ли поведение в более поздних версиях .NET Framework?

Примечание:

Это сложный вопрос, и я думаю, что полный ответ, вероятно, упомянет разницу между статическимконструктор и статическийинициализатори как они взаимодействуют сbeforefieldinit произвести заявленный результат.

Ответы на вопрос(2)

Ваш ответ на вопрос