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 | CA1831 |
| Judul | Gunakan AsSpan alih-alih pengindeks berbasis Rentang untuk string jika sesuai |
| Kategori | Performa |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Sebagai peringatan |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Pengindeks rentang digunakan pada string dan nilai secara implisit ditetapkan ke ReadOnlySpan<char>.
Deskripsi aturan
Aturan ini diaktifkan saat Anda menggunakan pengindeks rentang pada string dan menetapkannya ke tipe rentang. Pengindeks rentang pada Span<T> adalah operasi Slice non-penyalinan, tetapi untuk pengindeks rentang pada string, metode Substring akan digunakan sebagai pengganti Slice. Ini menghasilkan salinan bagian string yang diminta. Salinan ini biasanya tidak perlu ketika secara implisit digunakan sebagai nilai ReadOnlySpan<T> atau ReadOnlyMemory<T>. Jika salinan tidak dimaksudkan, gunakan metode AsSpan untuk menghindari salinan yang tidak perlu. Jika penyalinan dimaksudkan, tetapkan terlebih dahulu ke variabel lokal atau tambahkan pemeran eksplisit. Penganalisis hanya melaporkan ketika konversi implisit digunakan pada hasil operasi pengindeks rentang.
Mendeteksi
Konversi implisit:
ReadOnlySpan<char> slice = str[a..b];
Tidak mendeteksi
Konversi eksplisit:
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, gunakan AsSpan alih-alih pengindeks berbasis Range pada string untuk menghindari pembuatan salinan data yang tidak perlu.
public void TestMethod(string str)
{
// The violation occurs
ReadOnlySpan<char> slice = str[1..3];
...
}
public void TestMethod(string str)
{
// The violation fixed with AsSpan extension method
ReadOnlySpan<char> slice = str.AsSpan()[1..3];
...
}
Tips
Perbaikan kode tersedia untuk aturan ini di Visual Studio. Untuk menggunakannya, posisikan kursor pada pelanggaran dan tekan Ctrl+. (titik). Pilih Gunakan AsSpan alih-alih pengindeks berbasis Rentang pada string dari daftar opsi yang disajikan.
Anda juga dapat menambahkan konversi eksplisit untuk menghindari peringatan ini.
public void TestMethod(string str)
{
// The violation occurs.
ReadOnlySpan<char> slice = str[1..3];
...
}
public void TestMethod(string str)
{
// The violation avoided with explicit casting.
ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
...
}
Kapan harus menekan peringatan
Aman untuk mengabaikan pelanggaran aturan ini jika memang dimaksudkan untuk membuat salinan.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA1831
// The code that's violating the rule is on this line.
#pragma warning restore CA1831
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1831.severity = none
Untuk menonaktifkan seluruh kategori aturan ini, atur tingkat keparahan untuk kategori ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Aturan terkait
- CA1832: Gunakan AsSpan atau AsMemory, bukan pengindeks berbasis Rentang untuk mendapatkan bagian ReadOnlySpan atau ReadOnlyMemory dari larik
- CA1833: Gunakan AsSpan atau AsMemory daripada pengindeks berbasis Rentang untuk mendapatkan bagian Rentang atau Memori dari array