Threadsicherheit von statischen Initialisierern in C #

Jeder sagt, statische Initialisierer seien threadsicher, aber ich mache mir Sorgen um ein bestimmtes Detail.

Sagen wir, ich habe

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

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

Welche der folgenden Eigenschaften garantiert C #, wann?MyStaticClass.myField ist noch nicht initialisiert?

Versuchen Sie, auf Thread 1 und 2 zuzugreifenmyField zusammen (in dieser Reihenfolge),GetNewObject werde habengestartet Ausführen, bevor Thread 2 liestmyField.

Versuchen Sie, auf Thread 1 und 2 zuzugreifenmyField zusammen (in dieser Reihenfolge),GetNewObject werde habenfertig Ausführen, bevor Thread 2 liestmyField.

Wie steht es mit der CLR im Allgemeinen: Wenn sich ihre Garantien von denen in C # unterscheiden, inwiefern unterscheiden sie sich?
Hat sich das Verhalten in neueren Versionen von .NET Framework geändert?

Hinweis:

Es ist eine knifflige Frage, und ich denke, eine vollständige Antwort würde wahrscheinlich den Unterschied zwischen einer statischen Frage erwähnenKonstrukteur und eine statischeInitialisiererund wie sie interagierenbeforefieldinit das behauptete Ergebnis zu erzeugen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage