CA2019:ThreadStatic 字段不应使用内联初始化

属性
规则 ID CA2019
标题 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

何时禁止显示警告

可以安全地禁止显示来自此规则的警告,但应用可能会表现出意外行为。

另请参阅