Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
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
Когда лучше отключить предупреждения
Подавлять предупреждение по этому правилу безопасно, но ваше приложение может проявлять непредсказуемое поведение.