【问题标题】:Tool to detect use/abuse of String.Concat (where StringBuilder should be used)检测使用/滥用 String.Concat 的工具(应使用 StringBuilder)
【发布时间】:2010-05-10 16:48:28
【问题描述】:

众所周知,不应使用 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" 在 IL 输出中映射到 String.Concat。)显然,我无法实际搜索整个项目并评估每个 += 以确定左值是否为字符串。

理想情况下,它只会指出 for/foreach 循环内的调用,但我什至会忍受所有注意到 every String.Concat 的误报。另外,我知道有一些重构工具会自动重构我的代码以使用StringBuilder,但我现在只对确定Concat 的用法感兴趣。

我经常在我的代码上运行 Gendarme 和 FxCop,但这些工具都不能识别我所描述的内容。但是,作为@Cristian pointed out,旧版本的 FxCop 曾经检查过这一点。也许有办法从旧版本的 FxCop 中提取该规则并告诉新版本 (1.36) 使用它?

【问题讨论】:

  • 嗯,C#(或者说 .NET)需要 FindBugs。

标签: c# .net static-analysis stringbuilder


【解决方案1】:

也许 NDepend CQL(代码查询语言)足以表达这一点。不过不确定是不是。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 显然我从未见过这个的原因是the particular rule was removed in 2007 or earlier“很遗憾,这些规则基于我们的旧数据流引擎,并在从产品中删除时被删除。我们将在未来版本的 Visual Studio 中恢复它们。”
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多