CA2019: ThreadStatic Pole by neměly používat řádkovou inicializaci

Vlastnost Hodnota
ID pravidla CA2019
Název ThreadStatic pole by neměla používat inicializaci přímo ve zdrojovém kódu.
Kategorie Spolehlivost
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Jako návrh
Příslušné jazyky C# a Visual Basic

Příčina

Pole s anotací ThreadStaticAttribute je inicializováno přímo nebo explicitně v konstruktoru static (Shared v jazyce Visual Basic).

Popis pravidla

ThreadStaticAttribute pole by měla být líně inicializována při jejich použití, nikoli vloženou inicializací nebo explicitně v konstruktoru static (Shared v jazyce Visual Basic). A static konstruktor inicializuje pouze to pole ve vlákně, které spouští konstruktor typu static.

Jak opravit porušení

Chcete-li opravit porušení, odeberte inline inicializaci nebo inicializaci konstruktoru static. Místo toho inicializujte pole při prvním použití.

Příklad

Následující fragment kódu ukazuje porušení ca2019:

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

Následující fragment kódu ukazuje, jak opravit narušení:

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

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla, ale vaše aplikace může vykazovat neočekávané chování.

Viz také