CA1831: Gunakan AsSpan alih-alih pengindeks berbasis Rentang untuk string jika sesuai
Properti | Nilai |
---|---|
ID Aturan | CA1831 |
Judul | Gunakan AsSpan alih-alih pengindeks berbasis Rentang untuk string jika sesuai |
Golongan | Performa |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 8 | Sebagai peringatan |
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 jenis rentang. Pengindeks rentang pada Span<T> adalah operasi Slice non-penyalinan, tetapi untuk pengindeks rentang pada string, metode Substring akan digunakan alih-alih 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 salinan dimaksudkan, tetapkan ke variabel lokal terlebih dahulu atau tambahkan konversi 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];
...
}
Tip
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 menyembunyikan pelanggaran aturan ini jika membuat salinan dimaksudkan.
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