Segurança de thread de inicializadores estáticos em c #
Todo mundo diz que inicializadores estáticos são thread-safe, mas estou preocupado com um detalhe em particular.
Vamos dizer que eu tenho
static class MyStaticClass
{
public static readonly object myField = MyOtherClass.GetNewObject();
}
static class MyOtherClass
{
public static object GetNewObject()
{ /* arbitrary code that returns a new object */ }
}
Qual das seguintes opções C # garante, quandoMyStaticClass.myField
ainda não está inicializado?
Se os tópicos 1 e 2 tentarem acessarmyField
juntos (nessa ordem),GetNewObject
terácomeçado executando antes do segmento 2 lêmyField
.
Se os tópicos 1 e 2 tentarem acessarmyField
juntos (nessa ordem),GetNewObject
teráacabado executando antes do segmento 2 lêmyField
.
Como sobre o CLR em geral: se suas garantias diferem dos C # 's, de que maneira eles diferem?
O comportamento mudou em versões mais recentes do .NET framework?
É uma pergunta complicada, e acho que uma resposta completa provavelmente mencionaria a diferença entre umaconstrutor e uma estáticainicializadore como eles interagem combeforefieldinit
para produzir o resultado reivindicado.