2009-08-25 69 views
16

如何有效地处理StringBuilder对象?如果用户一次生成多个报告,我的应用程序将最终使用大量内存。处理StringBuilder对象

我读过的一些网站的在线的后续可能会有帮助:

StringBuilder sb = new StringBuilder(1000000); 

// loop goes here adding lots of stuff to sb 

exampleObject.Text = sb.ToString(); 

sb.Length = 0; 

是否最后一行真的有用吗?任何其他方式处理这个?

注意:这并不能阻止我的用户继续使用该应用程序。我只是想知道是否有避免冗余内存使用的方法。

+2

取出1000000可能有帮助 – David 2009-08-25 21:30:04

+3

如何?预分配内存帮助了很多。让StringBuilder不断调整大小会让事情变得相当缓慢。 – Druid 2009-08-25 23:25:46

回答

33

不,StringBuilder是一个纯粹的管理资源。你应该摆脱所有对它的引用。其他的都是由垃圾收集器的照顾:

StringBuilder sb = ...; 
// ... do work 
sb = null; // or simply let it go out of scope. 

在.NET中,没有确定性delete(如C++,在那里你腾出分配给单个对象的内存。)只有GC可以释放内存。通过放弃对对象的所有引用,您可以让GC根据需要释放对象。您可以通过调用System.GC.Collect方法来强制执行垃圾回收。但是,除非你真的知道你在做什么,否则不建议使用GC进行操作。 GC很聪明。迫使它很难受益。

+1

如果应用程序内的内存利用率过高,导致内存耗尽问题,则添加GC.Collect()非常有效。 .net垃圾回收会在您尝试分配额外内存并且O/S处于饥饿状态时或在其下一个周期中自动清除它。通常你不需要它,除非你的应用是非常性能驱动的。 – 2016-05-19 20:32:07

1

除非“内存过度使用”是一个问题,我会离开它,因为它是不担心。

.NET是足够聪明,避免做垃圾回收,如果你有足够的可用内存大多数情况下。

2

如果生成许多报告,你可以考虑重新使用单一的StringBuilder而不是分配每个报告一个新的。