我想问一下,为了重用StringBuilder,您认为清除内容的最佳方式(持续时间短/消耗资源少)是什么.想象一下下面的场景:

StringBuilder sb = new StringBuilder();
f或each(var whatever in whateverlist)
{
  sb.Append("{0}", whatever);
}

//Perf或m some stuff with sb

//Clear stringbuilder here

//Populate stringbuilder again to perf或m m或e actions
f或each(var whatever2 in whateverlist2)
{
  sb.Append("{0}", whatever2);
}

清除StringBuilder时,我可以想到两种可能性:

sb = new StringBuilder();

sb.Length = 0;

最好的清除方法是什么?为什么?

谢谢.

编辑:编辑当前内容.NET3.5版本.

推荐答案

如果您在.NET2.0或3.5中执行此操作,请编写一个扩展方法来执行此操作,如下所示:

/// <summary>
///     Clears the contents of the string builder.
/// </summary>
/// <param name="value">
///     The <see cref="StringBuilder"/> to clear.
/// </param>
public static void Clear(this StringBuilder value)
{
    value.Length = 0;
    value.Capacity = 0;
}

然后,您可以这样清除它:

someStringBuilder.Clear();

然后,当4.0问世时,您可以放弃扩展方法,转而使用4.0版本.

UPDATE:将容量设置为零可能不是个好主意.如果重用同一个实例,那么在附加到构建器时,这将保证重新分配.但是,在将容量设置为非常小的值(例如1)之前,不会释放生成器实例中的内存.Capacity属性的默认值为16.您可能需要考虑使用16,或者(虽然效率较低)两次设置容量:

  • 将其设置为1或0以清除内存
  • 将其设置为原始容量值(可能与16不同)以恢复它.

.net相关问答推荐

等待时 Blazor 服务器按钮刷新

信号量的多线程问题

MongoDB GridFs with C#,如何存储图片等文件?

是否可以将 SandCastle 创建的两个页面合并到一个主页中?

C# - 获取不包括隐藏文件的文件列表

string.Format 如何处理空值?

发布版本中的 Debug.WriteLine

.Net 中的 Int128?

C# 中 try/finally 的开销?

覆盖方法上的 C# 可选参数

在 C# 中将字符串转换为十六进制字符串

在 .NET (C#) 中本地存储数据的最佳方式

什么是 C# 中的自动属性,它们的用途是什么?

如何在 WebBrowser 控件中注入 Javascript?

C# 中的 override 和 new 关键字有什么区别?

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

C# (.NET) 设计缺陷

如何在 Dapper.Net 中编写一对多查询?

当它被抛出和捕获时,不要在那个异常处停止调试器

泛型类的静态成员是否与特定实例相关联?