Delen via


CA2019: ThreadStatic velden mogen geen inline initialisatie gebruiken

Eigenschap Waarde
Regel-id CA2019
Titel ThreadStatic velden mogen geen inline initialisatie gebruiken
Categorie Betrouwbaarheid
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Als suggestie
Toepasselijke talen C# en Visual Basic

Oorzaak

Een veld dat is geannoteerd met ThreadStaticAttribute wordt inline geïnitialiseerd of expliciet in een static-constructor (Shared in Visual Basic).

Beschrijving van regel

ThreadStaticAttribute velden moeten op laadtijd bij gebruik worden geïnitialiseerd en niet via inline-initialisatie of expliciet in een static constructor (Shared in Visual Basic). Een static-constructor initialiseert alleen het veld op de thread waarop de static-constructor van het type wordt uitgevoerd.

Een schending oplossen

Als u een schending wilt oplossen, verwijdert u de initialisatie van de inline of static constructor. Initialiseer in plaats daarvan het veld bij eerste gebruik.

Voorbeeld

In het volgende codefragment ziet u een schending van CA2019:

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

In het volgende codefragment ziet u hoe u een schending kunt oplossen:

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

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken, maar uw app kan onverwacht gedrag vertonen.

Zie ook