CA2019: ThreadStatic поля не должны использовать встроенную инициализацию

Свойство Значение
Идентификатор правила CA2019
Заголовок ThreadStatic поля не должны использовать встроенную инициализацию
Категория Надежность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Поле, помеченное аннотацией, ThreadStaticAttribute инициализируется встроенным или явным образом в static конструкторе (Shared в Visual Basic).

Описание правила

ThreadStaticAttribute поля должны инициализироваться не только при использовании, но не с встроенной инициализацией или явным образом в static конструкторе (Shared в Visual Basic). Конструктор 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

Когда лучше отключить предупреждения

Это безопасно для подавления предупреждения из этого правила, но ваше приложение может привести к непредвиденному поведению.

См. также