检测String.Concat的使用/滥用的工具(应该使用StringBuilder)

时间:2010-05-10 16:48:28

标签: c# .net static-analysis stringbuilder

众所周知,您不应使用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)使用它?

2 个答案:

答案 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,在同一个链接中,他们详细阐述了两种方法的性能。