Удаление объекта StringBuilder - PullRequest
       8

Удаление объекта StringBuilder

21 голосов
/ 26 августа 2009

Как эффективно распоряжаться объектом StringBuilder? Если пользователь генерирует несколько отчетов за один раз, мое приложение использует огромный объем памяти.

Я читал на нескольких сайтах в Интернете, что может помочь следующее:

StringBuilder sb = new StringBuilder(1000000);

// loop goes here adding lots of stuff to sb

exampleObject.Text = sb.ToString();

sb.Length = 0;

Последняя строка действительно помогает? Любой другой способ справиться с этим?

NB. Это не мешает моим пользователям продолжать использовать приложение. Мне просто интересно, есть ли способ избежать использования избыточной памяти.

Ответы [ 3 ]

41 голосов
/ 26 августа 2009

Нет, 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 умный. Редко выгодно форсировать это.

2 голосов
/ 26 августа 2009

Если вы генерируете много отчетов, вы можете рассмотреть возможность повторного использования одного StringBuilder вместо выделения нового для каждого отчета.

2 голосов
/ 26 августа 2009

Если «чрезмерное использование памяти» не является проблемой, я бы оставил все как есть и не беспокоиться об этом.

.NET в большинстве случаев достаточно умен, чтобы избежать сборки мусора, если у вас достаточно памяти.

...