Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| 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.