CA1845: используйте string.Concat на основе диапазона

Свойство Значение
Идентификатор правила CA1845
Заголовок Используйте строку на основе диапазона. Сцепить
Категория Производительность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Это правило находит выражения объединения строк, содержащие вызовы Substring, и предлагает заменить Substring на AsSpan, а также использовать перегрузку на базе диапазона для String.Concat.

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

Вызов Substring создает копию извлеченной подстроки. Используя AsSpan вместо Substring и вызывая перегрузку string.Concat, которая принимает диапазоны, можно исключить ненужное выделение строк.

Устранение нарушений

Чтобы устранить нарушения:

  1. замените объединение строк вызовом string.Concat;
  2. замените вызовы Substring вызовами AsSpan.

В следующем фрагменте кода приведены примеры нарушений и способы их устранения.

using System;

class Example
{
    public void Method()
    {
        string text = "fwobz the fwutzle";

        //  Violation: allocations by Substring are wasteful.
        string s1 = text.Substring(10) + "---" + text.Substring(0, 5);

        //  Fixed: using AsSpan avoids allocations of temporary strings.
        string s2 = string.Concat(text.AsSpan(10), "---", text.AsSpan(0, 5));
    }
}

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

Не отключайте предупреждения, создаваемые этим правилом. Если извлеченная подстрока передается только методу, имеющему эквивалент на базе диапазона, нет никаких причин использовать Substring вместо AsSpan.

См. также