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 9 | Sebagai saran |
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
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.