Bagikan melalui


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

Properti Nilai
ID Aturan CA2246
Judul Jangan menetapkan simbol dan anggotanya dalam pernyataan yang sama
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Simbol dan anggotanya ditetapkan dalam pernyataan yang sama. Misalnya:

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

Deskripsi aturan

Menetapkan simbol dan anggota simbol, yaitu bidang atau properti, dalam 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-tugas menjadi dua pernyataan penetapan sederhana atau lebih. 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 menekan pelanggaran dari aturan ini.

Baca juga