Бөлісу құралы:


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

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

Причина

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

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

Это правило срабатывает при использовании в строке индексатора диапазона и назначении ему типа span. Индексатор диапазона для Span<T> — это операция Slice без копирования, но для индексатора диапазона в строке вместо метода Substring будет использоваться метод Slice. В результате будет создана копия запрошенной части строки. Эта копия обычно не требуется, если она неявным образом используется в качестве значения 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 вместо индексатора, основанного на диапазоне, для строки.

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

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

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

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

См. также