CA2002 : Ne définissez pas un verrou sur des objets à identité faible

Propriété Value
Identificateur de la règle CA2002
Titre Ne définissez pas un verrou sur des objets à identité faible
Catégorie Fiabilité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Un thread tente d’acquérir un verrou sur un objet qui a une identité faible.

Description de la règle

Un objet est dit d'identité faible lorsqu'il est accessible directement au-delà des limites d'un domaine d'application. Un thread qui essaie d'acquérir un verrou sur un objet qui affiche une identité faible peut être bloqué par un deuxième thread dans un domaine d'application différent qui dispose d'un verrou sur le même objet.

Les types suivants ont une identité faible et sont marqués par la règle :

Comment corriger les violations

Pour corriger une violation de cette règle, utilisez un objet d’un type qui ne figure pas dans la liste de la section Description.

Quand supprimer les avertissements

Il est sûr de supprimer l’avertissement si l’objet verrouillé est this ou Me, et que la visibilité du type d’objet self est privée ou interne, et que l’instance n’est pas accessible à l’aide d’une référence publique.

Autrement, ne supprimez pas un avertissement de cette règle.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

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

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

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

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

CA2213 : Les champs pouvant être supprimés doivent l’être

Exemple

L’exemple suivant montre quelques verrous d’objet qui violent la règle.

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

Voir aussi