CA2019: ThreadStatic fält bör inte använda direktinitiering

Egenskap Värde
Regel-ID CA2019
Title ThreadStatic fält bör inte använda inline-initiering
Kategori Tillförlitlighet
Korrigeringen är antingen invasiv eller icke-invasiv Oumbrytbar
Aktiverad som standard i .NET 10 Som förslag
Tillämpliga språk C# och Visual Basic

Orsak

Ett fält som är märkt med ThreadStaticAttribute initieras inline eller explicit i en static-konstruktor (Shared i Visual Basic).

Regelbeskrivning

ThreadStaticAttribute fält bör initieras fördröjt vid användning och inte med initiering in-line eller explicit i en static (Shared i Visual Basic) konstruktor. En static konstruktor initierar bara fältet på tråden som kör typens static konstruktor.

Så här åtgärdar du en överträdelse

Åtgärda en överträdelse genom att ta bort den infogade initieringen eller initieringen av static konstruktorn. Initiera i stället fältet vid första användningen.

Exempel

Följande kodfragment visar ett brott mot CA2019:

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

Följande kodfragment visar hur du åtgärdar en överträdelse:

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

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln, men din app kan uppvisa oväntat beteende.

Se även