CA2246: Jangan tetapkan simbol dan anggota simbol dalam kalimat yang sama

Properti Nilai
ID Aturan CA2246
Judul Jangan menetapkan simbol dan anggotanya dalam pernyataan yang sama
Kategori Penggunaan
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Sebagai saran
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Simbol dan anggotanya ditetapkan dalam pernyataan yang sama. Contohnya:

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

Deskripsi aturan

Menggunakan simbol dan anggotanya, yaitu bidang atau properti, dalam satu pernyataan yang sama tidak disarankan. Tidak jelas apakah akses anggota dimaksudkan untuk menggunakan nilai lama simbol sebelum penetapan atau nilai baru dari penetapan dalam pernyataan ini. Untuk kejelasan, pernyataan multi-tugas harus dibagi menjadi dua atau beberapa pernyataan penugasan sederhana.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran, pisahkan pernyataan multi-penugasan menjadi dua atau lebih banyak pernyataan penetapan sederhana. Misalnya, cuplikan kode berikut menunjukkan pelanggaran aturan dan beberapa cara untuk memperbaikinya berdasarkan niat pengguna:

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

Kapan harus menekan peringatan

Jangan mengabaikan pelanggaran atas aturan ini.

Lihat juga