C# 中的 string / StringBuilder / 值类型 / 引用类型 / CLR 总结
C# 中的 string / StringBuilder / 值类型 / 引用类型 / CLR 总结
1. String 与 StringBuilder
特性 | string | StringBuilder |
---|---|---|
可变性 | 不可变(immutable) | 可变(mutable) |
内存操作 | 每次修改会生成新对象 | 在原对象上直接修改 |
使用场景 | 字符串较少修改 | 字符串频繁拼接或修改 |
线程安全 | 是(不可变天然线程安全) | 否(需手动保证线程安全) |
示例:
string a = "abc";
a += "def"; // 生成新字符串对象var sb = new StringBuilder("abc");
sb.Append("def"); // 修改原对象
2. 值类型 vs 引用类型
特性 | 值类型 | 引用类型 |
---|---|---|
存储位置 | 栈(stack)或嵌入对象中 | 堆(heap) |
赋值行为 | 复制内容 | 复制引用(指向同一对象) |
常见类型 | int , float , struct | class , string , 数组, StringBuilder |
可空性 | 可用 Nullable<T> | 可直接为 null |
区别要点:
- 值类型赋值:修改副本,不影响原变量。
- 引用类型赋值:多个变量可能指向同一对象,修改会相互影响。
3. CLR(Common Language Runtime)
- .NET 运行时环境,负责执行 C# 代码、内存管理和垃圾回收(GC)。
- 值类型一般分配在栈上,由作用域结束时释放。
- 引用类型分配在堆上,由 GC 自动回收。
string
是引用类型,但不可变,并且 CLR 会对其进行**字符串驻留(interning)**优化。
4. 快速记忆口诀
string 不可变 → 每次修改生成新对象
StringBuilder 可变 → 高效拼接修改
值类型 栈上存 → 复制内容
引用类型 堆上存 → 复制引用
CLR 管内存 → GC 回收引用对象