Share via


CA2246: Tilldela inte en symbol och dess medlem i samma instruktion

Property Värde
Regel-ID CA2246
Title Tilldela inte en symbol och dess medlem i samma instruktion
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En symbol och dess medlem tilldelades i samma instruktion. Till exempel:

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

Regelbeskrivning

Att tilldela en symbol och dess medlem, dvs. ett fält eller en egenskap, i samma instruktion rekommenderas inte. Det är oklart om medlemsåtkomsten var avsedd att använda symbolens gamla värde före tilldelningen eller det nya värdet från tilldelningen i den här instruktionen. För tydlighetens skull måste multi-assign-instruktionen delas upp i två eller flera enkla tilldelningsinstruktioner.

Så här åtgärdar du överträdelser

Om du vill åtgärda överträdelser delar du upp multi-assign-instruktionen i två eller flera enkla tilldelningsinstruktioner. Följande kodfragment visar till exempel ett brott mot regeln och ett par sätt att åtgärda den baserat på användarens avsikt:

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

När du ska ignorera varningar

Förhindra inte överträdelser från den här regeln.

Se även