Dela via


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

Property Värde
Regel-ID CA2019
Title ThreadStatic fält bör inte använda infogad initiering
Kategori Tillförlitlighet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 9 Som förslag

Orsak

Ett fält som kommenteras med ThreadStaticAttribute initieras infogat eller explicit i en static (Shared i Visual Basic) konstruktor.

Regelbeskrivning

ThreadStaticAttribute fält bör initieras lazily vid användning och inte med infogad initiering 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 static konstruktorns initiering. 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