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 :
Tableaux de types valeur, y compris les types intégraux, les types à virgule flottante et Boolean.
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.
Règles associées
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) { }
}
}