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
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.

Perbaikan kode untuk CA1831 - Gunakan AsSpan alih-alih pengindeks berbasis Rentang jika sesuai

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.

Lihat juga