Bagikan melalui


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

Code fix for CA1832 - Use AsSpan or AsMemory instead of Range-based indexers for getting ReadOnlySpan or ReadOnlyMemory portion of an array

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.

Baca juga