StringBuilder因可变缓冲区设计,在频繁字符串修改时比不可变的string更高效,避免了大量临时对象与内存分配。

在C#中,StringBuilder 通常比 string 在频繁修改字符串时效率更高。原因在于两者的设计机制不同:string 是不可变类型,每次拼接都会创建新对象;而 StringBuilder 使用可变缓冲区,避免频繁内存分配。
string 的性能问题
当你对 string 进行拼接操作时,例如:
string result = "";for (int i = 0; i {
result += i.ToString();
}
每次 += 操作都会创建一个新的 string 对象,并将原内容复制过去。这会导致大量临时对象产生,增加 GC 压力,性能随操作次数呈平方级下降。
StringBuilder 的优势
StringBuilder 内部维护一个字符数组缓冲区,支持动态扩容。在频繁追加、插入或删除字符时,能显著减少内存分配次数。
例如:
var sb = new StringBuilder();for (int i = 0; i {
sb.Append(i);
}
string result = sb.ToString();
这段代码只在最后调用 ToString() 时生成一次字符串,其余操作都在缓冲区完成,效率远高于直接拼接 string。
使用建议与优化技巧
掌握以下几点,可以写出更高效的字符串处理代码:
-
少量拼接用 string.Concat 或插值:如果只有2~3次拼接,直接使用
$"Hello {name}"或string.Concat(a, b)更简洁高效。 - 循环拼接必须用 StringBuilder:涉及循环或不确定次数的追加操作,优先选择 StringBuilder。
-
预设容量减少扩容开销:如果能预估最终长度,初始化时指定容量,如
new StringBuilder(1024),避免多次重新分配内存。 - 避免不必要的 ToString():不要在循环中频繁调用 ToString() 获取中间结果,仅在最终输出时调用一次。
-
考虑 Span
和 stackalloc :对于高性能场景(如解析、格式化),可使用 Span在栈上操作字符,进一步提升效率。
基本上就这些。关键是理解 string 的不可变性带来的开销,在需要修改的场景下合理使用 StringBuilder 或更现代的替代方案。不复杂但容易忽略。











