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

我想问你认为什么是最好的方法(持续less/消耗更less的资源)来清除内容,以便重用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); } 

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

 sb = new StringBuilder(); 

要么

 sb.Length = 0; 

什么是最好的方式来清除它,为什么?

谢谢。

编辑:我用目前的.NET 3.5版本。

如果你在.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; } 

那么,你可以像这样清除它:

 someStringBuilder.Clear(); 

然后,当4.0出来,你可以抛弃你的扩展方法,而倾向于4.0版本。

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

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

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

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

创build新的StringBuilder。 旧的维护与它相关的资源(例如最大长度的缓冲区),最好只是将垃圾收集起来。

从MSDN社区内容:

为了有效清除你的stringbuilder而不破坏它使用:

  someStringBuilder.length = 0; someStringBuilder.capacity = 0; 

这破坏了它的内容并将其重新调整为零。 如上所述,清晰的大小可以影响较小的应用程序。

我认为你正在做不成熟的优化。

我敢打赌,做sb.Length=0; 将是创build另一个对象和将另一个对象放在一边以便GC最终收集的最快速度。

我认为创build一个新的StringBuilder将是内存关注的最佳select。 并设置sb.Length将是速度问题的最佳拍摄。

在.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()); 

如果您正在寻求减less内存使用量,我将使用CLR Profiler来检查您的StringBuilder对象在其生命周期中使用其他人如上所述的方法所使用的内存量。 那么你可以满足你自己,你select的选项是适合你的需求,并释放你需要它的资源。

我会说清除它的最好方法是使用sb = new StringBuilder(); 。 话虽如此,我认为如果您完全创build了一个新的string生成器对象,情况会更好。

编辑

我希望不用说这是最好的解决scheme。

 public StringBuilder MakeString(IEnumerable<CoolType> list) { StringBuilder sb = new StringBuilder(); foreach(var whatever in list) { sb.Append("{0}", whatever); } } var sb = MakeString(whateverList); // Do stuff // Clear stuff sb = MakeString(whateverList2);