CA2246: Keine Zuweisung eines Symbols und seines Members in der gleichen Anweisung

Eigenschaft Wert
Regel-ID CA2246
Titel Keine Zuweisung eines Symbols und seines Members in der gleichen Anweisung
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Ein Symbol und sein Member wurden in der gleichen Anweisung zugewiesen. Beispiel:

// 'a' and 'a.Field' are assigned in the same statement
a.Field = a = b;

Regelbeschreibung

Es wird nicht empfohlen, ein Symbol und sein Member, d. h. ein Feld oder eine Eigenschaft, in der gleichen Anweisung zuzuweisen. Es ist nicht eindeutig, ob für den Memberzugriff der alte Wert des Symbols vor der Zuweisung oder der neu zugewiesene Wert in dieser Anweisung verwendet werden soll. Damit dies deutlich wird, muss die Anweisung mit der Mehrfach-Zuweisung in zwei oder mehr einfache Zuweisungsanweisungen aufgeteilt werden.

Behandeln von Verstößen

Um Verstöße zu beheben, teilen Sie die Anweisung mit der Mehrfach-Zuweisung in zwei oder mehr einfache Zuweisungsanweisungen auf. Der folgende Codeausschnitt zeigt beispielsweise einen Verstoß gegen die Regel und, je nach Absicht des jeweiligen Nutzers, mehrere Korrekturmöglichkeiten:

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;'
    }
}

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie die Verstöße dieser Regel nicht.

Siehe auch