Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
| Eigenschaft | Wert |
|---|---|
| Regel-ID | CA2246 |
| Titel | In der gleichen Anweisung darf nicht ein Symbol und sein Mitglied zugewiesen werden. |
| Kategorie | Verwendung |
| Fix führt zu Unterbrechungen oder bleibt funktionsfähig | Untrennbar |
| Standardmäßig in .NET 10 aktiviert | Als Vorschlag |
| Anwendbare Sprachen | C# und Visual Basic |
Ursache
Ein Symbol und sein Mitglied 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. Zur Klarheit muss die Mehrfachzuweisungsanweisung in zwei oder mehr einfache Zuweisungen aufgeteilt werden.
So beheben Sie Verstöße
Um Verstöße zu beheben, teilen Sie die Mehrfachzuweisungsanweisung in zwei oder mehr einfache Zuweisungen 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.