CA1833: Gunakan AsSpan atau AsMemory alih-alih pengindeks berbasis Rentang untuk mendapatkan bagian Rentang atau Memori dari array
Properti | Nilai |
---|---|
ID Aturan | CA1833 |
Judul | Gunakan AsSpan atau AsMemory alih-alih pengindeks berbasis Rentang untuk mendapatkan rentang atau Bagian memori dari array |
Golongan | Performa |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | Sebagai saran |
Penyebab
Saat menggunakan pengindeks rentang pada array dan secara implisit menetapkan nilai ke Span<T> atau Memory<T>.
Deskripsi aturan
Pengindeks rentang pada Span<T> adalah operasi non-penyalinan Slice . Tetapi untuk pengindeks rentang pada array, metode GetSubArray akan digunakan alih-alih Slice, yang menghasilkan salinan bagian array yang diminta. Salinan ini biasanya tidak perlu ketika secara implisit digunakan sebagai nilai Span<T> atau Memory<T>. Jika salinan tidak dimaksudkan, gunakan metode AsSpan atau AsMemory 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:
Span<SomeT> slice = arr[a..b];
Memory<SomeT> slice = arr[a..b];
Tidak mendeteksi
Konversi eksplisit:
Span<SomeT> slice = (Span<SomeT>)arr[a..b];
Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, gunakan AsSpan metode atau AsMemory ekstensi untuk menghindari pembuatan salinan data yang tidak perlu.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs for both statements below
Span<byte> tmp2 = arr[0..5];
Memory<byte> tmp4 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
Span<byte> tmp2 = arr.AsSpan()[0..5];
Memory<byte> tmp4 = arr.AsMemory()[5..10];
...
}
}
Tip
Perbaikan kode tersedia untuk aturan ini di Visual Studio. Untuk menggunakannya, posisikan kursor pada pelanggaran dan tekan Ctrl+. (titik). Pilih Gunakan AsMemory alih-alih pengindeks berbasis Rentang di array dari daftar opsi yang ditampilkan.
Anda juga dapat menghindari peringatan ini dengan menambahkan konversi eksplisit.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
Span<byte> tmp1 = arr[0..5];
Memory<byte> tmp2 = arr[5..10];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
Span<byte> tmp1 = (Span<byte>)arr[0..5];
Memory<byte> tmp2 = (Memory<byte>)arr[5..10];
...
}
}
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 CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1833.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Aturan terkait
- CA1831: Gunakan AsSpan alih-alih pengindeks berbasis Rentang untuk string jika sesuai
- CA1832: Gunakan AsSpan atau AsMemory, bukan pengindeks berbasis Rentang untuk mendapatkan bagian ReadOnlySpan atau ReadOnlyMemory dari larik