CA2002: Nie należy blokować obiektów z słabą tożsamością
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2002 |
Tytuł | Nie blokuj obiektów o słabej tożsamości |
Kategoria | Niezawodność |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Wątek próbuje uzyskać blokadę na obiekcie, który ma słabą tożsamość.
Opis reguły
Obiekt ma słabą tożsamość, gdy można uzyskać do niego bezpośredni dostęp poza granicami domeny aplikacji. Wątek, który próbuje uzyskać blokadę na obiekcie o słabej tożsamości, może zostać zablokowany przez drugi wątek w domenie innej aplikacji, która ma blokady dla tego samego obiektu.
Następujące typy mają słabą tożsamość i są oflagowane przez regułę:
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, użyj obiektu typu, który nie znajduje się na liście w sekcji Opis.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie, jeśli zablokowany obiekt jest this
lub Me
, a widoczność typu obiektu self jest prywatna lub wewnętrzna, a wystąpienie nie jest dostępne przy użyciu żadnego publicznego odwołania.
W przeciwnym razie nie pomijaj ostrzeżenia z tej reguły.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2002
// The code that's violating the rule is on this line.
#pragma warning restore CA2002
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2002.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Powiązane reguły
CA2213: Pola możliwe do likwidacji powinny zostać zlikwidowane
Przykład
W poniższym przykładzie przedstawiono niektóre blokady obiektów naruszające regułę.
Imports System
Imports System.IO
Imports System.Reflection
Imports System.Threading
Namespace ca2002
Class WeakIdentities
Sub SyncLockOnWeakId1()
SyncLock GetType(WeakIdentities)
End SyncLock
End Sub
Sub SyncLockOnWeakId2()
Dim stream As New MemoryStream()
SyncLock stream
End SyncLock
End Sub
Sub SyncLockOnWeakId3()
SyncLock "string"
End SyncLock
End Sub
Sub SyncLockOnWeakId4()
Dim member As MemberInfo =
Me.GetType().GetMember("SyncLockOnWeakId1")(0)
SyncLock member
End SyncLock
End Sub
Sub SyncLockOnWeakId5()
Dim outOfMemory As New OutOfMemoryException()
SyncLock outOfMemory
End SyncLock
End Sub
End Class
End Namespace
class WeakIdentities
{
void LockOnWeakId1()
{
lock (typeof(WeakIdentities)) { }
}
void LockOnWeakId2()
{
MemoryStream stream = new MemoryStream();
lock (stream) { }
}
void LockOnWeakId3()
{
lock ("string") { }
}
void LockOnWeakId4()
{
MemberInfo member = this.GetType().GetMember("LockOnWeakId1")[0];
lock (member) { }
}
void LockOnWeakId5()
{
OutOfMemoryException outOfMemory = new OutOfMemoryException();
lock (outOfMemory) { }
}
}