CA2019: ThreadStatic-Felder sollten keine Inlineinitialisierung verwenden

Eigenschaft Wert
Regel-ID CA2019
Titel ThreadStatic-Felder sollten keine Inlineinitialisierung verwenden
Kategorie Zuverlässigkeit
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Ein Feld, das mit einer ThreadStaticAttribute-Anmerkung versehen ist, wird inline oder explizit in einem static-Konstruktor (Shared in Visual Basic) initialisiert.

Regelbeschreibung

ThreadStaticAttribute-Felder sollten bei der Verwendung verzögert initialisiert werden und nicht durch Inlineinitialisierung oder explizit in einem static-Konstruktor (Shared in Visual Basic). Ein static-Konstruktor initialisiert nur das Feld für den Thread, der den static-Konstruktor des Typs ausführt.

Beheben einer Verletzung

Um eine Verletzung zu beheben, entfernen Sie die Inline- oder static-Konstruktorinitialisierung. Initialisieren Sie das Feld stattdessen bei der ersten Verwendung.

Beispiel

Der folgende Codeschnipsel zeigt eine Verletzung von CA2019:

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

Der folgende Codeschnipsel zeigt, wie eine Verletzung behoben wird:

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

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung von dieser Regel zu unterdrücken, aber Ihre App könnte unerwartetes Verhalten aufweisen.

Weitere Informationen