2009-08-25 71 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而不是分配每個報告一個新的。