C Sharp StringBuilder
外观
C# StringBuilder[编辑 | 编辑源代码]
StringBuilder 是 .NET Framework 中提供的一个高效处理字符串的类,位于 System.Text
命名空间。它专门用于需要频繁修改字符串的场景,避免了常规字符串(string
类型)因不可变性(immutable)而导致的性能问题。
为什么使用 StringBuilder?[编辑 | 编辑源代码]
在 C# 中,string
类型是不可变的,这意味着每次对字符串进行修改(如拼接、替换或删除)时,都会创建一个新的字符串对象。这在循环或大量操作中会导致性能下降和内存浪费。例如:
string result = "";
for (int i = 0; i < 10000; i++)
{
result += i.ToString(); // 每次循环都会创建一个新字符串
}
这种方式效率极低,因为每次拼接都会分配新的内存。而 StringBuilder
通过内部维护一个可变的字符缓冲区(buffer),避免了频繁的内存分配,从而显著提升性能。
StringBuilder 的基本用法[编辑 | 编辑源代码]
创建 StringBuilder[编辑 | 编辑源代码]
可以通过构造函数初始化 StringBuilder
,并指定初始内容或容量:
using System.Text;
// 空 StringBuilder
StringBuilder sb1 = new StringBuilder();
// 带初始字符串
StringBuilder sb2 = new StringBuilder("Hello");
// 指定初始容量(默认16,超出时会自动扩容)
StringBuilder sb3 = new StringBuilder(100);
常用方法[编辑 | 编辑源代码]
方法 | 描述 | 示例 |
---|---|---|
Append |
追加字符串或数据 | sb.Append(" World");
|
Insert |
在指定位置插入内容 | sb.Insert(5, " C#");
|
Remove |
删除指定范围的字符 | sb.Remove(5, 3);
|
Replace |
替换字符串中的字符或子串 | sb.Replace("World", "C#");
|
ToString |
转换为不可变字符串 | string result = sb.ToString();
|
示例:拼接字符串[编辑 | 编辑源代码]
以下示例展示了如何使用 StringBuilder
高效拼接多个字符串:
StringBuilder sb = new StringBuilder();
sb.Append("C# ");
sb.Append("StringBuilder ");
sb.Append("is ");
sb.Append("efficient!");
Console.WriteLine(sb.ToString()); // 输出:C# StringBuilder is efficient!
性能对比:String vs StringBuilder[编辑 | 编辑源代码]
通过以下代码对比两者的性能差异:
// 使用 string 拼接(低效)
Stopwatch sw1 = Stopwatch.StartNew();
string str = "";
for (int i = 0; i < 100000; i++)
{
str += i.ToString();
}
sw1.Stop();
Console.WriteLine($"String 耗时: {sw1.ElapsedMilliseconds} ms");
// 使用 StringBuilder(高效)
Stopwatch sw2 = Stopwatch.StartNew();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100000; i++)
{
sb.Append(i.ToString());
}
sw2.Stop();
Console.WriteLine($"StringBuilder 耗时: {sw2.ElapsedMilliseconds} ms");
输出结果可能类似:
String 耗时: 4500 ms StringBuilder 耗时: 10 ms
实际应用场景[编辑 | 编辑源代码]
动态生成 SQL 查询[编辑 | 编辑源代码]
在数据库操作中,可能需要动态拼接 SQL 查询条件:
StringBuilder query = new StringBuilder("SELECT * FROM Users WHERE 1=1");
if (!string.IsNullOrEmpty(nameFilter))
{
query.Append($" AND Name = '{nameFilter}'");
}
if (minAge > 0)
{
query.Append($" AND Age >= {minAge}");
}
Console.WriteLine(query.ToString());
日志记录[编辑 | 编辑源代码]
在日志系统中,StringBuilder
可用于高效拼接多行日志:
StringBuilder log = new StringBuilder();
log.AppendLine($"[{DateTime.Now}] 开始处理请求");
log.AppendLine($"参数: {JsonConvert.SerializeObject(data)}");
log.AppendLine($"结果: {response.StatusCode}");
File.WriteAllText("log.txt", log.ToString());
高级特性[编辑 | 编辑源代码]
容量管理[编辑 | 编辑源代码]
StringBuilder
内部使用动态数组存储字符,默认初始容量为 16,超出时会自动扩容(通常翻倍)。可以通过以下属性优化性能:
Capacity
:获取或设置当前容量。EnsureCapacity(int)
:确保容量至少为指定值。
示例:
StringBuilder sb = new StringBuilder();
sb.EnsureCapacity(1000); // 预分配大容量以减少扩容次数
链式调用[编辑 | 编辑源代码]
StringBuilder
的方法通常返回自身实例,支持链式调用:
string result = new StringBuilder()
.Append("Hello")
.Append(" ")
.Append("World")
.Replace("World", "C#")
.ToString();
总结[编辑 | 编辑源代码]
- 适用场景:频繁修改字符串(如循环拼接、动态生成内容)。
- 优势:避免内存浪费,提升性能。
- 注意:单次或少量字符串操作时,直接使用
string
更简单。
通过合理使用 StringBuilder
,可以显著提高字符串处理效率,尤其是在大规模数据操作中。