CA2002: Ne zárolja a gyenge identitású objektumokat

Tulajdonság Érték
Szabályazonosító CA2002
Cím Ne zárolja a gyenge identitású objektumokat
Kategória Megbízhatóság
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

Egy szál megpróbál zárolást megszerezni egy olyan objektumon, melynek gyenge az identitása.

Szabály leírása

A rendszer azt állítja, hogy egy objektum gyenge identitással rendelkezik, ha közvetlenül elérhető az alkalmazás tartományhatárai között. A gyenge identitással rendelkező objektumok zárolását lekérni próbáló szálakat egy másik alkalmazástartomány második szála blokkolhatja, amely ugyanahhoz az objektumhoz van zárolva.

A következő típusok gyenge identitással rendelkeznek, és a szabály megjelöli:

Szabálysértések kijavítása

A szabály megsértésének kijavításához használjon olyan típusú objektumot, amely nem szerepel a Leírás szakaszban található listában.

Mikor kell letiltani a figyelmeztetéseket?

A figyelmeztetést biztonságosan elnyomhatja, ha a zárolt objektum this vagy Me, a saját objektum típusa láthatósága privát vagy belső, és a példány nem érhető el nyilvános hivatkozással.

Egyébként ne nyomja el ennek a szabálynak a figyelmeztetését.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

CA2213: Eldobható mezőket kell megsemmisíteni

Példa

Az alábbi példa néhány objektumzárolást mutat be, amelyek megsértik a szabályt.

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();
        lock (stream) { }
    }

    void LockOnWeakId3()
    {
        lock ("string") { }
    }

    void LockOnWeakId4()
    {
        MemberInfo member = this.GetType().GetMember("LockOnWeakId1")[0];
        lock (member) { }
    }
    void LockOnWeakId5()
    {
        OutOfMemoryException outOfMemory = new();
        lock (outOfMemory) { }
    }
}

Lásd még