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


CA1831: используйте AsSpan вместо индексаторов на основе диапазона для строки при необходимости

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

Причина

В строке используется индексатор диапазона, и неявным образом задается значение для ReadOnlySpan<char>.

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

Это правило срабатывает при использовании в строке индексатора диапазона и назначении ему типа span. Индексатор диапазона для Span<T> — это операция Slice без копирования, но для индексатора диапазона в строке вместо метода Slice будет использоваться метод Substring. В результате будет создана копия запрошенной части строки. Эта копия обычно не требуется, если она неявным образом используется в качестве значения ReadOnlySpan<T> или ReadOnlyMemory<T>. Если копия не нужна, используйте метод AsSpan. Если копия требуется, назначьте ее локальной переменной или добавьте явное приведение. Анализатор выводит сообщение только в том случае, когда в результате операции индексатора диапазона используется неявное приведение.

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

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

ReadOnlySpan<char> slice = str[a..b];

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

Явное преобразование

ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[a..b];

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

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

public void TestMethod(string str)
{
    // The violation occurs
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation fixed with AsSpan extension method
    ReadOnlySpan<char> slice = str.AsSpan()[1..3];
    ...
}

Совет

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

Code fix for CA1831 - Use AsSpan instead of Range-based indexers when appropriate

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

public void TestMethod(string str)
{
    // The violation occurs.
    ReadOnlySpan<char> slice = str[1..3];
    ...
}
public void TestMethod(string str)
{
    // The violation avoided with explicit casting.
    ReadOnlySpan<char> slice = (ReadOnlySpan<char>)str[1..3];
    ...
}

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

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

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

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

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

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

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

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

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Performance.severity = none

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

См. также