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.