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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top