众所周知,不应使用 StringBuilder 代替少量串联:
string s = "Hello";
if (greetingWorld)
{
s += " World";
}
s += "!";
然而,在相当大的循环中,StringBuilder 是显而易见的选择:
string s = "";
foreach (var i in Enumerable.Range(1,5000))
{
s += i.ToString(); // <- bad idea!
}
Console.WriteLine(s);
是否有一种工具可以在原始 C# 源代码或已编译程序集上运行,以识别源代码中String.Concat
被调用的位置?(如果您不熟悉,s += "foo"
则映射到String.Concat
IL 输出中。)显然,我无法实际搜索整个项目并评估每个项目+=
以确定左值是否为字符串。
理想情况下,它只会指出 for/foreach 循环内的调用,但我什至会忍受所有的误报 String.Concat
。另外,我知道有一些重构工具会自动重构我的代码以使用StringBuilder
,但我现在只对确定Concat
使用情况感兴趣。
我经常在我的代码上运行 Gendarme 和 FxCop,但这些工具都不能识别我所描述的内容。但是,正如@Cristian 指出的那样,旧版本的 FxCop 曾经对此进行检查。也许有一种方法可以从旧版本的 FxCop 中提取该规则并告诉新版本(1.36)使用它?