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