Бөлісу құралы:


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

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

Причина

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

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

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

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

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

См. также