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" вместо индексатора на основе диапазона в массиве из списка параметров, представленных.
Вы также можете избежать этого предупреждения, добавив явный приведение.
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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Связанные правила
- CA1831: используйте AsSpan вместо индексаторов на основе диапазона для строки при необходимости
- CA1833: используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части диапазона или памяти массива.