出于纯粹的好奇心,除了显而易见的StringBuilder
和MyBuilder = New StringBuilder
之外,有没有办法释放MyBuilder.Remove(0, Length)
使用的记忆(虽然我想后者不会自由什么,不是吗?)
谢谢!
CFP。
答案 0 :(得分:3)
最好的方法是让它超出范围,GC会处理内存。
答案 1 :(得分:1)
你可以让它超出范围或删除(0,长度),然后将Capacity设置为0(我认为如果你将Capacity设置为0,它会释放额外的内存,但我不完全确定)。
答案 2 :(得分:1)
你是对的,使用Remove()方法只重置一个内部索引,它对内部数组没有任何作用。不明确管理内存是.NET框架的关键属性,垃圾收集器会自动对其进行排序。
从技术上讲,你可以通过调用GC.Collect()来实现。然而,这几乎总是一个真正糟糕的想法。是的,你将使StringBuilder实例及其内部数组消失,只要没有任何引用。但它也过早地促进了程序中的其他对象。这意味着他们会坚持不必要的时间,你的程序最终将使用更多内存。
答案 3 :(得分:1)
您可以随时使用MyBuilder = Nothing
,但我通常只是让它们超出范围。
答案 4 :(得分:1)
简单的解决方案:我同意让垃圾收集器通过让你的字符串生成器超出范围来处理它可能是最好也是最简单的。
stringBuilder = Nothing
显式解决方案:在较新版本的.NET框架中,StringBuilder
类实际上有一个Clear
方法,用于删除字符串构建器中的所有字符。 (或者,您可以将Length
属性设置为0
。)
最终,您可以将Capacity
属性设置为0
。 (请注意,Capacity
不得小于Length
,这就是您首先需要清除字符串构建器的原因。)
stringBuilder.Clear()
stringBuilder.Capacity = 0
答案 5 :(得分:0)
在.NET中为任何对象“释放内存”的方式是让GC处理它。
如果是StringBuilder
,只需将实例设置为Nothing
*即可。
我认为你可能会对在.NET中“处置”对象意味着什么感到困惑。 IDisposable
接口的目的是提供一种机制,通过该机制,对象可以释放对某些共享资源(例如文件流)的访问。调用Dispose
与释放内存不同。由于StringBuilder
无法访问任何共享资源,因此无需实施IDisposable
。
如果必须强制释放内存,那就是GC.Collect
的用途。但老实说,我永远不会遇到一个自己调用它的情况(而不是让GC决定何时执行集合)。
*我假设它是一个类级变量。如果它只是一个局部变量,那么就没有必要将它设置为Nothing
,因为它很快就会超出范围。