众所周知,您不应该使用 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/