Bagikan melalui


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

Code fix for CA1833 - Use AsSpan or AsMemory instead of Range-based indexers for getting Span or Memory portion of an array

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.

Baca juga