【发布时间】: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