Partage via


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.

Voir aussi