众所周知,您不应使用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
的源代码中的 where ? (如果您不熟悉,s += "foo"
将映射到IL输出中的String.Concat
。)显然,我无法实际搜索整个项目并评估每个+=
以确定是否左值是一个字符串。
理想情况下,它只会指出for / foreach循环中的调用,但我甚至会忍受注意每个 String.Concat
的所有误报。此外,我知道有一些重构工具会自动重构我的代码以使用StringBuilder
,但我只对此时确定Concat
用法感兴趣。
我经常在我的代码上运行Gendarme和FxCop,这些工具都没有识别出我所描述的内容。但是,作为@Cristian pointed out,旧版本的FxCop用于检查这一点。也许有一种方法可以从旧版本的FxCop中提取该规则并告诉较新版本(1.36)使用它?
答案 0 :(得分:3)
或许NDepend CQL(代码查询语言)足够表达。不确定是不是。
答案 1 :(得分:0)
FxCop 有的一些建议。查看this article
例如根据此代码中的文章:
static string BadConcatenate(string[] items)
{
string strRet = string.Empty;
foreach(string item in items)
{
strRet += item;
}
return strRet;
}
FxCop报告
"Change StringCompareTest.BadConcatenate(String[]):String to use StringBuilder
instead of String.Concat or +
修改
由于高噪音或不再适用的分析,似乎已删除规则CA1807。它看起来像编译器is not automatically replacing it,在同一个链接中,他们详细阐述了两种方法的性能。