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


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

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

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

См. также