Поделиться через


CA1832: используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части ReadOnlySpan или ReadOnlyMemory массива

Свойство Значение
Идентификатор правила CA1832
Заголовок используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части массива ReadOnlySpan или ReadOnlyMemory
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

При использовании индексатора на основе диапазона для массива и неявном присваивании значения структуре ReadOnlySpan<T> или ReadOnlyMemory<T>.

Описание правила

Индексатор диапазона для a Span<T> является операцией без копирования Slice . Но для индексатора диапазона массива метод GetSubArray будет использоваться вместо Sliceтого, чтобы создать копию запрошенной части массива. Эта копия обычно не требуется, если она неявным образом используется в качестве значения ReadOnlySpan<T> или ReadOnlyMemory<T>. Если копия не нужна, используйте метод AsSpan или AsMemory. Если копия требуется, назначьте ее локальной переменной или добавьте явное приведение.

Анализатор выводит сообщение только в том случае, когда в результате операции индексатора диапазона используется неявное приведение.

Обнаруживает

Неявные преобразования:

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

Не обнаруживает

Явные преобразования:

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

Устранение нарушений

Чтобы устранить нарушение этого правила, используйте AsSpan метод или AsMemory метод расширения, чтобы избежать создания ненужных копий данных.

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

Совет

Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите клавиши CTRL+ (период). Выберите " Использовать AsSpan" вместо индексатора на основе диапазона в массиве из списка параметров, представленных.

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

Вы также можете избежать этого предупреждения, добавив явный приведение.

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

Когда лучше отключить предупреждения

Можно отключить вывод предупреждения для этого правила, если предполагается создание копии.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

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

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

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

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также