CA1833: используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части диапазона или памяти массива.
Свойство | Значение |
---|---|
Идентификатор правила | CA1833 |
Заголовок | используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части массива Span или Memory |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | Как предложение |
Причина
При использовании индексатора на основе диапазона для массива и неявном присваивании значения структуре Span<T> или Memory<T>.
Описание правила
Индексатор диапазона для a Span<T> является операцией без копирования Slice . Но для индексатора диапазона массива метод GetSubArray будет использоваться вместо Sliceтого, чтобы создать копию запрошенной части массива. Эта копия обычно не требуется, если она неявным образом используется в качестве значения Span<T> или Memory<T>. Если копия не нужна, используйте метод AsSpan или AsMemory. Если копия требуется, назначьте ее локальной переменной или добавьте явное приведение. Анализатор выводит сообщение только в том случае, когда в результате операции индексатора диапазона используется неявное приведение.
Обнаруживает
Неявные преобразования:
Span<SomeT> slice = arr[a..b];
Memory<SomeT> slice = arr[a..b];
Не обнаруживает
Явные преобразования:
Span<SomeT> slice = (Span<SomeT>)arr[a..b];
Memory<SomeT> slice = (Memory<SomeT>)arr[a..b];
Устранение нарушений
Чтобы устранить нарушение этого правила, используйте AsSpan метод или AsMemory метод расширения, чтобы избежать создания ненужных копий данных.
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];
...
}
}
Совет
Для этого правила в Visual Studio доступно исправление кода. Чтобы использовать его, поместите курсор на нарушение и нажмите клавиши CTRL+ (период). В списке параметров выберите Используйте AsMemory вместо индексаторов на основе диапазона для массива.
Вы также можете избежать этого предупреждения, добавив явный приведение.
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];
...
}
}
Когда лучше отключить предупреждения
Можно отключить вывод предупреждения для этого правила, если предполагается создание копии.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1833
// The code that's violating the rule is on this line.
#pragma warning restore CA1833
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1833.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Связанные правила
- CA1831: используйте AsSpan вместо индексаторов на основе диапазона для строки при необходимости
- CA1832: используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части ReadOnlySpan или ReadOnlyMemory массива