Как мне избавиться от TextBuilder? - PullRequest
1 голос
/ 22 июля 2010

Из чистого любопытства, есть ли способ освободить память, используемую StringBuilder, кроме очевидных MyBuilder = New StringBuilder и MyBuilder.Remove(0, Length) (хотя я полагаю, что позже ничего не освободит, не так ли?)

Спасибо!
CFP.

Ответы [ 6 ]

3 голосов
/ 22 июля 2010

Лучший способ - оставить его вне поля зрения, и ГХ позаботится о памяти.

1 голос
/ 22 июля 2010

Простое решение: Я согласен, что, возможно, будет лучше и проще просто позволить сборщику мусора позаботиться об этом, позволив вашему строителю строк выйти из области видимости.

stringBuilder = Nothing

Явное решение: В более новых версиях .NET Framework класс StringBuilder фактически имеет метод Clear, который удаляет все символы в струнный строитель. (В качестве альтернативы вы можете установить для свойства Length значение 0.)

В конечном итоге вы можете установить для свойства Capacity значение 0. (Обратите внимание, что Capacity не должно быть меньше, чем Length, поэтому сначала необходимо очистить построитель строк.)

stringBuilder.Clear()
stringBuilder.Capacity = 0
1 голос
/ 22 июля 2010

Вы всегда можете использовать MyBuilder = Nothing, но я обычно просто позволяю им выпадать из области видимости.

1 голос
/ 22 июля 2010

Вы правы, использование метода Remove () просто сбрасывает внутренний индекс, он ничего не делает с внутренним массивом. Неявное управление памятью является ключевым свойством .NET Framework, сборщик мусора сортирует ее автоматически.

Технически это можно сделать, вызвав GC.Collect (). Это, однако, почти всегда действительно плохая идея. Да, вы заставите экземпляр StringBuilder и его внутренний массив исчезнуть, если на него не останется никаких ссылок. Но это также продвигает другие объекты в вашей программе слишком рано. Это означает, что они будут работать дольше, чем необходимо, ваша программа в конечном итоге будет использовать больше памяти.

1 голос
/ 22 июля 2010

Вы можете либо позволить ему выпасть из области видимости, либо удалить (0, Length), а затем установить Capacity на 0 (я думаю, это освобождает дополнительную память, если вы установите Capacity на 0, но я не совсем уверен).

0 голосов
/ 22 июля 2010

Способ, которым вы «освобождаете память» для любого объекта в .NET, позволяет GC позаботиться об этом.

В случае StringBuilder, просто установитенапример, Nothing*, и пусть это будет.

Я думаю, вы можете быть озадачены тем, что означает «избавляться» от объектов в .NET.Цель интерфейса IDisposable состоит в том, чтобы предоставить механизм, с помощью которого объекты могут освобождать доступ к некоторому общему ресурсу, например, к файловым потокам.Вызов Dispose - это не то же самое, что освобождение памяти.Поскольку StringBuilder не имеет доступа к каким-либо общим ресурсам, ему не нужно реализовывать IDisposable.

Если вы должны принудительно освободить память, вот что GC.Collect для.Но, честно говоря, я никогда не сталкивался со сценарием, в котором имело бы смысл называть это самостоятельно (в отличие от разрешения GC решать, когда имеет смысл выполнить сбор).

* Я предполагаю, что это переменная уровня класса.Если для начала это была только локальная переменная, нет необходимости устанавливать ее на Nothing, так как она все равно скоро выйдет из области видимости.

...