CA1833: Gunakan AsSpan atau AsMemory alih-alih pengindeks berbasis Range untuk mendapatkan bagian Span 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
Kategori Performa
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Sebagai saran
Bahasa yang berlaku C# dan Visual Basic

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

  • 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];
        ...
    }
}

Tips

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.

Perbaikan kode untuk CA1833 - Gunakan AsSpan atau AsMemory alih-alih pengindeks berbasis rentang untuk mendapatkan span atau bagian memori dari array

Anda juga dapat menghindari peringatan ini dengan menambahkan casting 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 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 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.

Lihat juga