Подтвердить что ты не робот

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

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

Я прочитал несколько сайтов в Интернете, которые могут помочь:

StringBuilder sb = new StringBuilder(1000000);

// loop goes here adding lots of stuff to sb

exampleObject.Text = sb.ToString();

sb.Length = 0;

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

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

4b9b3361

Ответ 1

Нет, a StringBuilder - это исключительно управляемый ресурс. Вы должны просто избавиться от всех ссылок на него. Все остальное заботится сборщик мусора:

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

В .NET нет детерминированного delete (например, С++, где вы освобождаете память, выделенную для одного объекта.) Только GC может освобождать память. Изменяя все ссылки на объект, вы позволяете GC быть способным освободить объект, если он захочет. Вы можете принудительно собрать мусор, вызвав метод System.GC.Collect. Тем не менее, не рекомендуется манипулировать GC, если вы действительно не знаете, что делаете. GC умный. Это редко полезно, чтобы заставить его.

Ответ 2

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

Ответ 3

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

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