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