Delen via


CA2019: ThreadStatic velden mogen geen inline initialisatie gebruiken

Eigenschappen Weergegeven als
Regel-id CA2019
Titel ThreadStatic velden mogen geen inline initialisatie gebruiken
Categorie Betrouwbaarheid
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Als suggestie

Oorzaak

Een veld met ThreadStaticAttribute aantekeningen wordt geïnitialiseerd of expliciet in een static constructor (Shared in Visual Basic).

Beschrijving van regel

ThreadStaticAttribute velden moeten lazily worden geïnitialiseerd voor gebruik en niet met inline initialisatie of expliciet in een static constructor (Shared in Visual Basic). Een static constructor initialiseert alleen het veld op de thread waarop de constructor van static 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.

Opmerking

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