C# Resolva as dependências entre os membros da estática automaticamente?
-
19-09-2019 - |
Pergunta
Se um membro estático de dados depende de outro membro estático de dados, o C#/. Líquido garante o membro estático dependente é inicializado antes do membro dependente?
Por exemplo, temos uma aula como:
class Foo
{
public static string a = "abc";
public static string b = Foo.a + "def";
}
Quando Foo.b É acessado, é sempre "abcdef" ou pode ser "def"?
Se isso não for garantido, existe uma maneira melhor de garantir que o membro dependente inicializado primeiro?
Solução
Como dito antes, a inicialização do campo estático é determinística e vai de acordo com a ordem da declaração textual.
Veja isso, por exemplo:
class Foo
{
public static string b = a + "def";
public static string a = "abc";
}
Foo.b sempre resultará em "def".
Nesse caso, quando há uma dependência entre os campos estáticos, é melhor usar um inicializador estático:
class Foo
{
public static string b;
public static string a;
static Foo()
{
a = "abc";
b = a + "def";
}
}
Dessa forma, você expressa explicitamente sua preocupação com a ordem de inicialização; ou dependência para esse assunto (mesmo que o compilador não ajude se você acidentalmente trocar as declarações de inicialização.) O acima terá os valores esperados armazenados em A e B (respectivamente "ABC" e "ABCDEF").
No entanto, as coisas podem ficar torcidas (e específicas de implementação) para a inicialização de campos estáticos definidos em várias classes. A seção 10.4.5.1 Inicialização do campo estático da especificação do idioma fala um pouco mais.
Outras dicas
Ele mostrará sempre "ABCDEF", porque a inicialização cai de cima para baixo na fonte, hoje como antes.
Todos os membros estáticos serão inicializados após o carregamento do classtype, segurando -os.