Share via


CA1832: Bir dizinin ReadOnlySpan veya ReadOnlyMemory bölümünü almak için Aralık tabanlı dizin oluşturucular yerine AsSpan veya AsMemory kullanın

Özellik Değer
Kural Kimliği CA1832
Başlık Bir dizinin ReadOnlySpan veya ReadOnlyMemory kısmını almak için Aralık tabanlı dizin oluşturucular yerine AsSpan ya da AsMemory kullanın
Kategori Performans
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

Bir dizide aralık dizin oluşturucu kullanırken ve değeri ReadOnlySpan<T> veya ReadOnlyMemory<T>öğesine örtük olarak atarken.

Kural açıklaması

üzerindeki Span<T> aralık dizin oluşturucu kopyalanamayan Slice bir işlemdir. Ancak bir dizideki aralık dizin oluşturucu için, dizinin istenen bölümünün bir kopyasını üreten yerine yöntemi GetSubArray kullanılır Slice. Bu kopya genellikle örtük olarak veya ReadOnlyMemory<T> değeri olarak kullanıldığında gereksizdirReadOnlySpan<T>. Bir kopya amaçlanmamışsa, gereksiz kopyayı önlemek için veya AsMemory yöntemini kullanınAsSpan. Kopya amaçlanıyorsa, önce yerel bir değişkene atayın veya açık bir atama ekleyin.

Çözümleyici yalnızca aralık dizin oluşturucu işleminin sonucu üzerinde örtük bir atama kullanıldığında bildirir.

Algı -lar

Örtük dönüştürmeler:

  • ReadOnlySpan<SomeT> slice = arr[a..b];
  • ReadOnlyMemory<SomeT> slice = arr[a..b];

Algılanmaz

Açık dönüştürmeler:

  • ReadOnlySpan<SomeT> slice = (ReadOnlySpan<SomeT>)arr[a..b];
  • ReadOnlyMemory<SomeT> slice = (ReadOnlyMemory<SomeT>)arr[a..b];

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için, gereksiz veri kopyaları oluşturmamak için veya AsMemory uzantısı yöntemini kullanınAsSpan.

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

Bahşiş

Visual Studio'da bu kural için bir kod düzeltmesi kullanılabilir. Bunu kullanmak için imleci ihlalin üzerine getirin ve Ctrl+ tuşuna (nokta) basın. Sunulan seçenekler listesinden bir dizideki Aralık tabanlı dizin oluşturucu yerine AsSpan Kullan'ı seçin.

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

Ayrıca, açık bir atama ekleyerek bu uyarıyı önleyebilirsiniz.

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

Uyarıların ne zaman bastırılması gerekiyor?

Kopya oluşturmanın amacı bu kuralın ihlalini engellemek güvenlidir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA1832
// The code that's violating the rule is on this line.
#pragma warning restore CA1832

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA1832.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Ayrıca bkz.