Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
CA2019:
| Свойство | Значение |
|---|---|
| Идентификатор правила | 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
Когда лучше отключить предупреждения
Подавлять предупреждение по этому правилу безопасно, но ваше приложение может проявлять непредсказуемое поведение.