CA2246: Aynı deyimde bir simgeyi ve üyelerini atamayın

Özellik Değer
Kural Kimliği CA2246
Başlık Sembol ve üyesini aynı deyime atama
Kategori Kullanım
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Öneri olarak
Geçerli diller C# ve Visual Basic

Neden

Aynı ifadede bir simge ve onun üyesi atandı. Ö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.