CA2246: Nie przypisuj symbolu i jego elementu członkowskiego w tej samej instrukcji

Właściwości Wartość
Identyfikator reguły CA2246
Tytuł Nie przypisuj symbolu i jego składowej w tej samej instrukcji
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Symbol i jego składowa zostały przypisane w tej samej instrukcji. Na przykład:

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

Opis reguły

Przypisywanie symbolu i jego elementu członkowskiego, czyli pola lub właściwości, w tej samej instrukcji nie jest zalecane. Nie jest jasne, czy dostęp do elementu członkowskiego miał używać starej wartości symbolu przed przypisaniem lub nowej wartości z przypisania w tej instrukcji. Aby uzyskać jasność, instrukcja wielokrotnego przypisywania musi być podzielona na co najmniej dwie proste instrukcje przypisania.

Jak naprawić naruszenia

Aby naprawić naruszenia, podziel instrukcję z wieloma przypisaniami na co najmniej dwie proste instrukcje przypisania. Na przykład poniższy fragment kodu przedstawia naruszenie reguły i kilka sposobów ich naprawy na podstawie intencji użytkownika:

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

Kiedy pomijać ostrzeżenia

Nie pomijaj naruszeń tej reguły.

Zobacz też