清除.NET的StringBuilder内容的最佳方法

Dav*_*art 69 .net c# optimization .net-3.5

我想问一下你认为最好的方法(持续时间更少/消耗更少的资源)来清除内容以重用StringBuilder.想象一下以下场景:

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

//Perform some stuff with sb

//Clear stringbuilder here

//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
  sb.Append("{0}", whatever2);
}
Run Code Online (Sandbox Code Playgroud)

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

sb = new StringBuilder();
Run Code Online (Sandbox Code Playgroud)

要么

sb.Length = 0;
Run Code Online (Sandbox Code Playgroud)

清除它的最佳方法是什么?为什么?

谢谢.

编辑:我使用当前的.NET 3.5版本.

Mik*_*fer 68

如果您在.NET 2.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;
}
Run Code Online (Sandbox Code Playgroud)

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

someStringBuilder.Clear();
Run Code Online (Sandbox Code Playgroud)

然后,当4.0出来时,你可以放弃你的扩展方法,而不是4.0版本.

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

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

  • 我建议不要清除容量,除非知道`StringBuilder`持有*异常*大.特别是在早期版本的.net中,如果一个人将重复构建超过42,500个字符的字符串,那么每次缓冲区必须重新生长时,清除每个字符串后的缓冲区将导致在大对象堆中分配额外的对象.这是一件坏事. (13认同)
  • 将容量设置为0是一个有趣的想法.当仅使用Clear或仅将长度设置为0时,重复使用Insert()时可能会发生内存泄漏,因为尽管清除了容量,容量仍在增长.(请参阅我的问题:http://stackoverflow.com/questions/29574469/memory-leak-in-stringbuilder-when-using-insert-and-clear (2认同)

Gra*_*meF 28

在.NET 4.0中,您可以调用,sb.Clear()但在旧版本中,您应该设置sb.Length = 0.

Clear()方法是在.NET 4.0中添加的.

  • 如果您正在重用它,您不想重用缓冲区吗? (15认同)
  • 取决于第一次创建的字符串与第二次创建的字符串相比有多大的差异..或者至少我会这么认为 (2认同)

Pau*_*ier 15

创建新的StringBuilder.旧的维护与之相关的资源(例如,最大长度的缓冲区),这些资源最好只是垃圾收集.


Ear*_*rlz 11

我认为你正在做过早的优化.

我敢打赌,做sb.Length=0;最快的事情就是不要创建另一个对象并将另一个对象放在一边,以便GC最终收集.

我认为创建一个新的StringBuilder将是内存问题的最佳镜头.和设置sb.Length将是速度问题的最佳镜头..


Yur*_*ich 11

来自MSDN上的社区内容:

要有效地清除你的stringbuilder而不破坏它,请使用:

 someStringBuilder.length = 0;
 someStringBuilder.capacity = 0;
Run Code Online (Sandbox Code Playgroud)

这会破坏其内容并将其调整为零.如上所述,清除尺寸会影响较小的应用.


Jay*_*hia 5

在.NET Framework 4中,在StringBuilder类中引入了新方法.方法名称为"清除".此方法可帮助您清除或删除StringBuilder对象中的值或数据.

这是一个例子.

    System.Text.StringBuilder objSB = new System.Text.StringBuilder();
    //Append values
    objSB.Append("This is .Net Blog.");
    objSB.Append("You can get latest C# Tips over here.");

    //Display on screen
    Response.Write(objSB.ToString());
    Response.Write("<br/><br/>");

    //Clear object using Clear method
    objSB.Clear();

    //Append another values
    objSB.Append("This blog is very useful for .Net Beginners");

    Response.Write("After Clear<br/><br/>");
    //Display on screen
    Response.Write(objSB.ToString());
Run Code Online (Sandbox Code Playgroud)