跳转到内容

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);

常用方法[编辑 | 编辑源代码]

StringBuilder 常用方法
方法 描述 示例
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,可以显著提高字符串处理效率,尤其是在大规模数据操作中。