c# - 检测使用/滥用 String.Concat 的工具(应该使用 StringBuilder 的地方)

标签 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 的源代码中的位置? (如果您不熟悉,s += "foo" 在 IL 输出中被映射到 String.Concat。)显然,我无法通过整个项目并评估每个 += 以确定左值是否为字符串。

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

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

最佳答案

也许 NDepend CQL (代码查询语言)对此具有足够的表现力。不确定是不是。

关于c# - 检测使用/滥用 String.Concat 的工具(应该使用 StringBuilder 的地方),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2804554/

相关文章:

c# - Entity Framework 6 - 将主键作为类型的属性

c# - 从 VB 到 C# 的正则表达式(LIKE 到正则表达式)

static-analysis - ACSL 的 "if"子句中的函数调用

javascript - 如何遍历spidermonkey生成的AST(Javascript文件)

c# - 如何在 EPPlus 中过滤列(而不是行)?

c# - 如果整数,OpenXML 读取错误的单元格值

.net - 推荐的 Prism v2 Silverlight/WPF 项目结构

c# - 申请许可证

.net - JSON.NET 教程

security - 是否有任何工具可以对 .net 桌面程序集和可执行文件执行安全分析?