×

C# 字符串拼接别乱写!错误写法导致 GC 频繁飙升

独孤求败 独孤求败 发表于2026-04-08 13:57:02 浏览13 评论0

抢沙发发表评论

在 C# 开发中,字符串拼接是最基础、最常用的操作,几乎每个项目都会用到。但很多新手甚至资深开发者,都习惯随手用 + 拼接字符串,觉得简单方便。

殊不知,错误的字符串拼接方式,会产生大量垃圾对象,让 GC(垃圾回收)频繁触发,直接拖慢程序性能,尤其是在循环、高频调用的场景中,性能差距能达到百倍千倍!

今天就带你彻底搞懂 C# 字符串拼接的正确姿势,避开性能大坑。



⭐️关注回复 “888” 领取:C# 字符串拼接学习资料及学习视频(含源码)↓↓↓



一、先搞懂核心:C# 字符串是不可变的


这是所有问题的根源,必须牢记:

C# 中的 string 是不可变类型(immutable

一旦创建了一个字符串对象,它的值就不能被修改。

你看似在「修改 / 拼接」字符串,实际上是新建了一个全新的字符串对象,旧的字符串对象就变成了垃圾,等待 GC 回收。

举个最简单的例子:

图片
这三行代码,在内存中创建了 3 个独立的字符串对象"a""ab""abc"
前两个对象用完就废弃,成了内存垃圾。

二、最坑的错误写法:循环中使用 + 拼接


这是最常见、危害最大的错误!循环次数越多,产生的垃圾对象越多,GC 压力直接拉满。

❌ 错误代码(千万不要这么写)


图片

这种写法的致命问题


  1. 循环 10000 次,就会创建10000 个临时字符串对象
  2. 大量垃圾对象堆积,GC 不得不频繁工作;
  3. 程序出现卡顿、CPU 占用升高、响应变慢。

我做过简单测试:循环 10 万次拼接+ 写法耗时几百毫秒,而正确写法仅需几毫秒,性能差距超过 100 倍!

三、正确写法:StringBuilder 专门解决拼接问题


C# 专门提供了 StringBuilder 类,用于高频、大量字符串拼接

它的核心优势:

  • 内部是可变字符数组,拼接时不会创建新对象;
  • 仅在最终需要结果时,生成一个字符串;
  • 零内存垃圾,GC 完全无压力。

✅ 标准正确代码


图片

为什么 StringBuilder 这么强?


  • 初始化时申请一块连续内存;
  • 拼接操作直接在原有内存上写入;
  • 容量不足时自动扩容,而非创建新对象;
  • 全程仅产生 1 个最终字符串,GC 零负担。

  • 四、不同场景,用对拼接方法(总结表)


  • 不是所有场景都必须用 StringBuilder,分场景选择才是最优解,我整理了开发中最实用的规则:


  • 拼接场景
    推荐写法
    不推荐写法
    原因
    少量固定字符串(<5 个)
    $"" 字符串插值、+
    编译器会优化,无性能问题
    循环拼接、高频拼接
    StringBuilder
    +、$""
    避免大量垃圾对象,GC 不飙升
    方法参数、格式化字符串
    string.Concat、string.Format
    多次 +
    官方优化方法,性能高
    大量动态字符串拼接
    StringBuilder
    任何其他方式
    唯一高性能方案


五、补充:这些高级写法,编译器会自动优化


很多人担心:那平时写 $"姓名:{name},年龄:{age}" 会不会有问题?

放心,完全不会!

C# 编译器会对少量、固定次数的字符串拼接做优化:

  • 字符串插值 $""
  • 少量 + 拼接
  • string.Concat


编译器会自动将其合并为一次调用,不会产生多余对象

✅ 推荐(少量拼接):

图片

六、核心总结(记住这 3 点就够了)


  1. string 不可变

    ,拼接 = 新建对象,多了就会触发 GC;
  2. 循环 / 高频拼接

    :必须用 StringBuilder,这是 GC 友好的唯一方案;
  3. 少量固定拼接

    :随便用 $"" 或 +,编译器会自动优化。


群贤毕至

访客