CA2246 : Ne pas attribuer un symbole et son membre dans la même instruction
Propriété | Value |
---|---|
Identificateur de la règle | CA2246 |
Titre | Ne pas attribuer un symbole et son membre dans la même instruction |
Catégorie | Utilisation |
Le correctif est cassant ou non cassant | Sans rupture |
Activé par défaut dans .NET 8 | À titre de suggestion |
Cause
Un symbole et son membre ont été attribués dans la même instruction. Par exemple :
// 'a' and 'a.Field' are assigned in the same statement
a.Field = a = b;
Description de la règle
L’affectation d’un symbole et de son membre, soit un champ ou une propriété, dans la même instruction n’est pas recommandée. Il est difficile de déterminer si l’accès du membre était destiné à utiliser l’ancienne valeur du symbole avant l’assignation ou la nouvelle valeur de l’assignation dans cette instruction. Pour plus de clarté, l’instruction à plusieurs assignations doit être divisée en deux ou plus instructions d’assignation simples.
Comment corriger les violations
Pour corriger les violations, fractionnez l’instruction à plusieurs assignations en deux ou plus instructions d’assignation simples. Par exemple, l’extrait de code suivant montre une violation de la règle et plusieurs façons de le corriger en fonction de l’intention de l’utilisateur :
public class C
{
public C Field;
}
public class Test
{
public void M(C a, C b)
{
// Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
// It is not clear if the user intent in the below statement is to assign to 'Instance1.Field' or 'Instance2.Field'.
// CA2246: Symbol 'a' and its member 'Field' are both assigned in the same statement. You are at risk of assigning the member of an unintended object.
a.Field = a = b;
}
}
public class C
{
public C Field;
}
public class Test
{
public void M(C a, C b)
{
// Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
// 'Instance1.Field' is intended to be assigned.
var instance1 = a;
a = b;
instance1.Field = a;
}
}
public class C
{
public C Field;
}
public class Test
{
public void M(C a, C b)
{
// Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
// 'Instance2.Field' is intended to be assigned.
a = b;
b.Field = a; // or 'a.Field = a;'
}
}
Quand supprimer les avertissements
Ne supprimez pas les violations de cette règle.