CA2019:ThreadStatic フィールドでインライン初期化を使用しないでください

プロパティ
ルール ID CA2019
Title ThreadStatic フィールドでは、インライン初期化を使用しないでください
[カテゴリ] 信頼性
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

ThreadStaticAttribute で注釈が付けられたフィールドはインラインで初期化される、または明示的に static (Visual Basic では Shared) コンストラクターで初期化されます。

規則の説明

ThreadStaticAttributeフィールドは、インライン初期化では使用せず、または static (Visual Basic では Shared) コンストラクターで明示的に初期化しないでください。 static コンストラクターは、static 型 のコンストラクターを実行するスレッドのフィールドのみを初期化します。

違反の修正方法

違反を修正するには、インラインまたは static コンストラクターの初期化を削除します。 代わりに、最初に使用するフィールドを初期化します。

次のコード スニペットは、CA2019 の違反を示しています:

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

次のコード スニペットでは、違反の修正方法を示します:

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

どのようなときに警告を抑制するか

このルールからの警告を抑制しても問題ありませんが、アプリで予期しない動作が発生する可能性があります。

こちらもご覧ください