C#的string和StringBuilder哪个效率高?C#字符串操作性能优化指南

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 或更现代的替代方案。不复杂但容易忽略。