在 C# 开发中,字符串拼接是最基础、最常用的操作,几乎每个项目都会用到。但很多新手甚至资深开发者,都习惯随手用 + 拼接字符串,觉得简单方便。
殊不知,错误的字符串拼接方式,会产生大量垃圾对象,让 GC(垃圾回收)频繁触发,直接拖慢程序性能,尤其是在循环、高频调用的场景中,性能差距能达到百倍千倍!
今天就带你彻底搞懂 C# 字符串拼接的正确姿势,避开性能大坑。
⭐️关注回复 “888” 领取:C# 字符串拼接学习资料及学习视频(含源码)↓↓↓
一、先搞懂核心:C# 字符串是不可变的
这是所有问题的根源,必须牢记:
C# 中的 string 是不可变类型(immutable)。
一旦创建了一个字符串对象,它的值就不能被修改。
你看似在「修改 / 拼接」字符串,实际上是新建了一个全新的字符串对象,旧的字符串对象就变成了垃圾,等待 GC 回收。
举个最简单的例子:
"a"、"ab"、"abc"。
二、最坑的错误写法:循环中使用 + 拼接
这是最常见、危害最大的错误!循环次数越多,产生的垃圾对象越多,GC 压力直接拉满。
❌ 错误代码(千万不要这么写)
这种写法的致命问题
循环 10000 次,就会创建10000 个临时字符串对象; 大量垃圾对象堆积,GC 不得不频繁工作; 程序出现卡顿、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 点就够了)
string 不可变
,拼接 = 新建对象,多了就会触发 GC; 循环 / 高频拼接
:必须用 StringBuilder,这是 GC 友好的唯一方案; 少量固定拼接
:随便用 $""或+,编译器会自动优化。