Compartilhar via


CA2019: os campos ThreadStatic não devem usar inicialização em linha

Propriedade Valor
ID da regra CA2019
Título Os campos ThreadStatic não devem usar a inicialização em linha
Categoria Confiabilidade
Correção interruptiva ou sem interrupção Inquebrável
Habilitado por padrão no .NET 10 Como sugestão
Idiomas aplicáveis C# e Visual Basic

Causa

Um campo anotado com ThreadStaticAttribute é inicializado em linha ou explicitamente em um constructo static (Shared no Visual Basic).

Descrição da regra

Os campos ThreadStaticAttribute devem ser inicializados de forma lenta em uso e não com inicialização em linha ou explicitamente em um constructostatic (Shared no Visual Basic). Um construtor static inicializa apenas o campo na thread que executa o construtor de tipo static.

Como corrigir uma violação

Para corrigir uma violação, remova a inicialização inline ou static do construtor. Em vez disso, inicialize o campo no primeiro uso.

Exemplo

O seguinte snippet de código mostra uma violação de CA2019:

class C
{
    [ThreadStatic]
    private static Object obj = new();
}
Class C
    <ThreadStatic>
    Private Shared obj As New Object()
End Class

O snippet de código a seguir mostra como corrigir uma violação:

class C
{
    [ThreadStatic]
    private static Object obj;

    static void S1()
    {
        obj ??= new Object();
    }
}
Class C
    <ThreadStatic>
    Private Shared obj

    Shared Sub S1()
        If obj Is Nothing Then
            obj = New Object()
        End If
    End Sub
End Class

Quando suprimir avisos

É seguro suprimir um aviso dessa regra, mas seu aplicativo pode apresentar um comportamento inesperado.

Confira também