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


CA1846: предпочитайте AsSpan вместо Substring

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

Причина

Результат вызова одной из перегрузок 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

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

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

См. также