Sdílet prostřednictvím


CA2002: Nepoužívejte zámky na objekty se slabou identitou

Vlastnost Hodnota
ID pravidla CA2002
Název Nepoužívejte zámky u objektů se slabou identitou
Kategorie Spolehlivost
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 9 No

Příčina

Vlákno se pokusí získat zámek u objektu, který má slabou identitu.

Popis pravidla

Objekt má slabou identitu, pokud k němu lze přímo přistupovat přes hranice aplikační domény. Vlákno, které se pokouší získat zámek na objekt se slabou identitou, může být blokováno jiným vláknem v jiné aplikační doméně, které má zámek na stejný objekt.

Následující typy mají slabou identitu a jsou označeny pravidlem:

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, použijte objekt typu, který není v seznamu v části Popis.

Kdy potlačit upozornění

Upozornění je bezpečné potlačit, pokud je this uzamčený objekt nebo Me viditelnost typu vlastního objektu soukromá nebo interní a instance není přístupná pomocí žádného veřejného odkazu.

Jinak nepotlačujte upozornění z tohoto pravidla.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA2002
// The code that's violating the rule is on this line.
#pragma warning restore CA2002

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

[*.{cs,vb}]
dotnet_diagnostic.CA2002.severity = none

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

CA2213: Uvolnitelné pole by mělo být uvolněno

Příklad

Následující příklad ukazuje některé zámky objektů, které porušují pravidlo.

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

Viz také