清除.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);