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.
| Property | Nilai |
|---|---|
| ID Aturan | CA1878 |
| Title | Lebih suka properti ReadOnlySpan daripada bidang array readonly |
| Category | Kinerja |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 11 | Sebagai saran |
| Bahasa yang berlaku | C# |
Cause
Bidang array satu dimensi statis privat berisi nilai konstanta yang didukung, dan semua penggunaan yang diamati dapat ditulis ulang dengan aman untuk menggunakan ReadOnlySpan<T> properti.
Deskripsi aturan
Bidang array baca-saja statis memerlukan alokasi array terkelola. Saat properti mengembalikan data konstanta yang ReadOnlySpan<T> didukung, pengkompilasi C# dapat menurunkan data tanpa mengalokasikan array terkelola. Mengganti bidang dengan properti dapat mengurangi alokasi sambil mempertahankan akses baca-saja ke data.
Penganalisis mendukung jenis elemen berikut:
-
bool,byte, dansbytedidukung setiap kali ReadOnlySpan<T> tersedia. -
short, ,ushort,intchar,uint,float,long,ulongdandoublehanya didukung ketika kompilasi target mengekspos metode statis RuntimeHelpers.CreateSpan<T>(RuntimeFieldHandle) publik. .NET 7 dan rakitan referensi yang lebih baru mengekspos metode ini.
Penganalisis tidak mendiagnosis array dari decimal, , nintnuint, jenis enum, struct arbitrer, atau jenis referensi. Ini juga tidak mendiagnosis array berjatuhan atau array multidmensional.
Cara memperbaiki pelanggaran
Ganti bidang array dengan properti bertubuh ekspresi yang mengembalikan ReadOnlySpan<T>.
Perbaikan kode menulis ulang penggunaan bidang yang memenuhi syarat. Untuk panggilan yang didukung AsSpan , panggilan akan menghapus panggilan redundan atau mengganti panggilan dengan operasi rentang yang setara, seperti Slice. Perbaikan kode tidak ditawarkan ketika tidak dapat mempertahankan semantik setiap penggunaan.
Example
Cuplikan kode berikut menunjukkan pelanggaran CA1878:
class CA1878ViolationExample
{
private static readonly byte[] Prefix = new byte[] { 0x50, 0x4B, 0x03, 0x04 };
public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}
Cuplikan kode berikut memperbaiki pelanggaran:
class CA1878FixExample
{
private static ReadOnlySpan<byte> Prefix => new byte[] { 0x50, 0x4B, 0x03, 0x04 };
public static ReadOnlySpan<byte> GetPrefix() => Prefix;
}
Kapan harus menekan peringatan
Menekan peringatan jika Anda sengaja mempertahankan identitas atau mutabilitas array, atau jika mempertahankan kompatibilitas API mengharuskan anggota untuk tetap menjadi bidang array. Aturan ini hanya melaporkan bidang baca-saja statis privat yang penggunaan yang diamati dapat ditulis ulang dengan aman.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan preprosesor pada file sumber Anda untuk menonaktifkan dan kemudian mengaktifkan kembali aturan tersebut.
#pragma warning disable CA1878
// The code that's violating the rule is on this line.
#pragma warning restore CA1878
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1878.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.