CA1846: предпочтение AsSpan
вместо Substring
Свойство | Значение |
---|---|
Идентификатор правила | CA1846 |
Заголовок | Предпочитать AsSpan вместо Substring |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | Как предложение |
Причина
Результат вызова одной из перегрузок String.Substring передается методу с доступной перегрузкой, который принимает ReadOnlySpan<Char>
.
Описание правила
Substring
выделяет новый string
объект в куче и выполняет полное копирование извлеченного текста. Обработка строк является узким местом производительности для многих программ. Выделение большого количества небольших кратковременных строк на критическом пути может создать достаточную нагрузку на коллекцию, чтобы повлиять на производительность. Копии O(n), созданные Substring
, становятся актуальными, когда подстроки становятся большими. Типы Span<T> и ReadOnlySpan<T> были созданы для решения этих проблем с производительностью.
Многие API-интерфейсы, принимающие строки, также имеют перегрузки, принимающие аргумент ReadOnlySpan<System.Char>
. Если такие перегрузки доступны, можно повысить производительность, вызвав AsSpan
вместо Substring
.
Устранение нарушений
Чтобы устранить нарушение этого правила, замените вызов string.Substring
вызовом одного из методов расширения MemoryExtensions.AsSpan.
using System;
public void MyMethod(string iniFileLine)
{
// Violation
int.TryParse(iniFileLine.Substring(7), out int x);
int.TryParse(iniFileLine.Substring(2, 5), out int y);
// Fix
int.TryParse(iniFileLine.AsSpan(7), out int x);
int.TryParse(iniFileLine.AsSpan(2, 5), out int y);
}
Imports System
Public Sub MyMethod(iniFileLine As String)
Dim x As Integer
Dim y As Integer
' Violation
Integer.TryParse(iniFileLine.Substring(7), x)
Integer.TryParse(iniFileLine.Substring(2, 5), y)
' Fix
Integer.TryParse(iniFileLine.AsSpan(7), x)
Integer.TryParse(iniFileLine.AsSpan(2, 5), y)
End Sub
Когда лучше отключить предупреждения
Вывод предупреждения для этого правила можно отключить, если производительность не является проблемой.