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

Property 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 Sem interrupção
Habilitado por padrão no .NET 8 Como sugestão

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 constructo static inicializa apenas o campo no thread que executa o constructo de static do tipo.

Como corrigir uma violação

Para corrigir uma violação, remova a inicialização em linha ou static do constructo. 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