CA1845:使用基于跨度的“string.Concat”
属性 | 值 |
---|---|
规则 ID | CA1845 |
标题 | 使用基于跨度的“string.Concat” |
类别 | “性能” |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 8 中默认启用 | 作为建议 |
原因
此规则查找包含 Substring 调用的字符串串联表达式,同时建议将 Substring 替换为 AsSpan 并使用基于跨度的 String.Concat 重载。
规则说明
调用 Substring
会生成提取的子字符串的副本。 通过使用 AsSpan
代替 Substring
,并调用接受跨度的 string.Concat
重载,可以消除不必要的字符串分配。
如何解决冲突
若要解决冲突,请执行以下操作:
- 将字符串串联替换为对
string.Concat
的调用,以及 - 将对
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
。