C# 中的 String 和 StringBuilder 的区别
1. String 类
- String 类表示不可变的字符串。
- 一旦创建 String 对象,其内容就不能再被修改。
- 对 String 对象进行任何修改操作都会返回一个新的 String 对象。
示例:
string str1 = "Hello";
string str2 = str1 + " World!";
Console.WriteLine(str1); // 输出:Hello
Console.WriteLine(str2); // 输出:Hello World!
// str1 和 str2 是两个不同的对象
Console.WriteLine(str1 == str2); // 输出:False
2. StringBuilder 类
- StringBuilder 类表示可变的字符串。
- 可以直接对 StringBuilder 对象进行插入、删除、替换等操作。
- StringBuilder 对象会在需要时自动扩展容量。
示例:
StringBuilder sb = new StringBuilder("Hello");
sb.Append(" World!");
Console.WriteLine(sb.ToString()); // 输出:Hello World!
// sb 是同一个对象
Console.WriteLine(sb.Capacity > sb.Length); // 输出:True
3. 两者的区别
区别 | String 类 | StringBuilder 类 |
---|---|---|
可变性 | 不可变 | 可变 |
内存分配 | 每次修改都分配新的内存空间 | 仅在第一次分配内存空间 |
线程安全 | 线程安全 | 非线程安全 |
适用场景 | 少量修改和频繁读取 | 频繁修改 |
4. 总结
- String 类适用于需要少量修改和频繁读取的场景,例如字符串的拼接、比较等。
- StringBuilder 类适用于需要频繁修改字符串内容的场景,例如循环拼接大量字符串或动态生成字符串。
建议:
- 在需要创建不可变字符串时,使用 String 类。
- 在需要频繁修改字符串内容时,使用 StringBuilder 类。
- 在多线程环境下使用 StringBuilder 类时,需要自行保证同步。