代码之家  ›  专栏  ›  技术社区  ›  Mark Rushakoff

用于检测字符串使用/滥用的工具。Concat(应使用StringBuilder的地方)

  •  4
  • Mark Rushakoff  · 技术社区  · 15 年前

    众所周知,您不应该使用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输出中。)显然,我不能现实地搜索整个项目并评估每个项目 += 以确定左值是否为字符串。

    理想情况下,它只会指出for/foreach循环中的调用,但我甚至会忍受所有的误报 每一个 一串连接两个字符串 .此外,我知道有些重构工具会自动重构我的代码以供使用 StringBuilder ,但我只想确定 Concat 此时的用法。

    我经常在代码中运行宪兵和FxCop,这两个工具都无法识别我描述的内容。然而 @Cristian pointed out ,旧版本的FxCop用于检查这一点。也许有一种方法可以从旧版本的FxCop中提取该规则,并告诉新版本(1.36)使用它?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Oded    15 年前

    也许是独立的 CQL (代码查询语言)足够表达这一点。但我不确定是不是。

        2
  •  0
  •   Community CDub    8 年前

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