CA1845:使用基于跨度的“string.Concat”

属性
规则 ID CA1845
标题 使用基于跨度的“string.Concat”
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .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));
    }
}

何时禁止显示警告

不要禁止显示此规则的警告。 当提取的子字符串仅传递给具有基于跨度的等效项的方法时,没有理由在 AsSpan 上使用 Substring

另请参阅