Bagikan melalui


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.

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

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.

Baca juga