CA1832: Gunakan AsSpan atau AsMemory alih-alih pengindeks berbasis Rentang untuk mendapatkan bagian ReadOnlySpan atau ReadOnlyMemory dari array
Properti | Nilai |
---|---|
ID Aturan | CA1832 |
Judul | Gunakan AsSpan atau AsMemory alih-alih pengindeks berbasis Rentang untuk mendapatkan bagian ReadOnlySpan atau ReadOnlyMemory 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 ReadOnlySpan<T> atau ReadOnlyMemory<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 ReadOnlySpan<T> atau ReadOnlyMemory<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:
ReadOnlySpan<SomeT> slice = arr[a..b];
ReadOnlyMemory<SomeT> slice = arr[a..b];
Tidak mendeteksi
Konversi eksplisit:
ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<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
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violations fixed with AsSpan or AsMemory accordingly
ReadOnlySpan<byte> tmp1 = arr.AsSpan()[0..2];
ReadOnlyMemory<byte> tmp3 = arr.AsMemory()[5..8];
...
}
}
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 array dari daftar opsi yang disajikan.
Anda juga dapat menghindari peringatan ini dengan menambahkan konversi eksplisit.
class C
{
public void TestMethod(byte[] arr)
{
// The violation occurs
ReadOnlySpan<byte> tmp1 = arr[0..2];
ReadOnlyMemory<byte> tmp3 = arr[5..8];
...
}
}
class C
{
public void TestMethod(byte[] arr)
{
// The violation fixed with explicit casting
ReadOnlySpan<byte> tmp1 = (ReadOnlySpan<byte>)arr[0..2];
ReadOnlyMemory<byte> tmp3 = (ReadOnlyMemory<byte>)arr[5..8];
...
}
}
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 CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA1832.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
- CA1833: Gunakan AsSpan atau AsMemory daripada pengindeks berbasis Rentang untuk mendapatkan bagian Rentang atau Memori dari array