CA2246: Aynı deyimde bir simge ve üyesi atama

Özellik Değer
Kural Kimliği CA2246
Başlık Sembol ve üyesini aynı deyime atama
Kategori Kullanım
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

Aynı deyimde bir simge ve üyesi atanmıştır. Örneğin:

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

Kural açıklaması

Aynı deyimde bir simgenin ve üyesinin( yani bir alanın veya özelliğin) atanması önerilmez. Üye erişiminin, atamadan önce simgenin eski değerini mi yoksa bu deyimdeki atamadaki yeni değeri mi kullanması amaçlandığı net değildir. Netlik için çoklu atama deyiminin iki veya daha fazla basit atama deyimine bölünmesi gerekir.

İhlalleri düzeltme

İhlalleri düzeltmek için çoklu atama deyimini iki veya daha fazla basit atama deyimine bölün. Örneğin, aşağıdaki kod parçacığı kuralın ihlalini ve kullanıcı amacına göre düzeltmenin birkaç yolunu gösterir:

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

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan gelen ihlalleri bastırmayın.

Ayrıca bkz.