我正在浏览开源项目SignalR的源代码,发现这个差异代码标题为"不要在此热点代码路径中使用StringBuilder或foreach":
- public static string MakeCursor(IEnumerable<Cursor> cursors)
+ public static string MakeCursor(IList<Cursor> cursors)
{
- var sb = new StringBuilder();
- bool first = true;
- foreach (var c in cursors)
+ var result = "";
+ for (int i = 0; i < cursors.Count; i++)
{
- if (!first)
+ if (i > 0)
{
- sb.Append('|');
+ result += '|';
}
- sb.Append(Escape(c.Key));
- sb.Append(',');
- sb.Append(c.Id);
- first = false;
+ result += Escape(cursors[i].Key);
+ result += ',';
+ result += cursors[i].Id;
}
- return sb.ToString();
+ return result;
}
我知道为什么 foreach 有时会不太高效,而且它被 for 取代了。
然而,我学习并体验到 StringBuilder 是连接字符串的最有效方式。所以我想知道作者为什么决定用标准的连接方法来替换它。
使用 StringBuilder 有什么问题或普遍的缺点吗?
foreach
比for
效率低?这取决于实现方式。此外,在这种情况下,重复字符串连接看起来像是个糟糕的想法,尤其是如果有大量光标。 - Jon Skeet