CA2002: Nie należy blokować obiektów z słabą tożsamością

Właściwości Wartość
Identyfikator reguły CA2002
Stanowisko 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 8 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.

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) { }
    }
}

Zobacz też