Bezpieczeństwo wątków statycznych inicjalizatorów w języku C #

Wszyscy mówią, że statyczne inicjalizatory są bezpieczne dla wątków, ale martwię się o konkretny szczegół.

Powiedzmy, że mam

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

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

Która z poniższych opcji C # gwarantuje, kiedyMyStaticClass.myField nie został jeszcze zainicjowany?

Jeśli wątki 1 i 2 próbują uzyskać dostępmyField razem (w tej kolejności),GetNewObject będzie miałzaczęło się wykonanie przed odczytem wątku 2myField.

Jeśli wątki 1 i 2 próbują uzyskać dostępmyField razem (w tej kolejności),GetNewObject będzie miałskończone wykonanie przed odczytem wątku 2myField.

Co z CLR w ogóle: jeśli jego gwarancje różnią się od C #, w jaki sposób się różnią?
Czy zachowanie zmieniło się w nowszych wersjach środowiska .NET?

Uwaga:

To trudne pytanie i myślę, że pełna odpowiedź prawdopodobnie wspomniałaby o różnicy między statycznymkonstruktor i statycznyinicjatori jak z nimi współdziałająbeforefieldinit wyprodukować żądany wynik.

questionAnswers(2)

yourAnswerToTheQuestion