Потоковая безопасность статических инициализаторов в 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
произвести заявленный результат.