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