Лучший способ очистить содержимое .NET StringBuilder

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

StringBuilder sb = new StringBuilder();
foreach(var whatever in whateverlist)
{
  sb.Append("{0}", whatever);
}

//Perform some stuff with sb

//Clear stringbuilder here

//Populate stringbuilder again to perform more actions
foreach(var whatever2 in whateverlist2)
{
  sb.Append("{0}", whatever2);
}

И при очистке StringBuilder я могу представить две возможности:

sb = new StringBuilder();

или

sb.Length = 0;

Каков наилучший способ его очистить и почему?

Спасибо.

EDIT: я использую текущую версию .NET 3.5.

Ответ 1

Если вы делаете это в .NET 2.0 или 3.5, напишите метод расширения, чтобы сделать это следующим образом:

/// <summary>
///     Clears the contents of the string builder.
/// </summary>
/// <param name="value">
///     The <see cref="StringBuilder"/> to clear.
/// </param>
public static void Clear(this StringBuilder value)
{
    value.Length = 0;
    value.Capacity = 0;
}

Затем вы можете очистить его следующим образом:

someStringBuilder.Clear();

Затем, когда выйдет 4.0, вы можете вырезать свой метод расширения в пользу версии 4.0.

ОБНОВЛЕНИЕ. Вероятно, не стоит устанавливать значение "Ноль". Это гарантирует перераспределение при добавлении к строителю, если вы повторно используете один и тот же экземпляр. Тем не менее, память в экземпляре строителя не будет выпущена до тех пор, пока вы не установите Емкость на очень маленькое значение (например, 1). Значение по умолчанию для свойства Capacity равно 16. Возможно, вам захочется использовать 16 или (хотя и менее эффективный), задав пропускную способность дважды:

  • Установите значение 1 или ноль, чтобы очистить память.
  • Установите его в исходное значение емкости (которое может отличаться от 16), чтобы восстановить его.

Ответ 2

В .NET 4.0 вы можете вызвать sb.Clear(), но в более старых версиях вы должны установить sb.Length = 0.

Метод Clear() был добавлен в .NET 4.0.

Ответ 3

Создайте новый StringBuilder. Старый поддерживает ресурсы, связанные с ним (например, буфер максимальной длины), которые лучше всего удаляют из мусора.

Ответ 4

Из содержимого сообщества на MSDN:

Чтобы эффективно очистить stringbuilder, не уничтожая его Применение:

 someStringBuilder.length = 0;
 someStringBuilder.capacity = 0;

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

Ответ 5

Я думаю, что вы делаете преждевременную оптимизацию.

Готов поспорить, что выполнение sb.Length=0; было бы самым быстрым, чтобы не создавать другой объект и не откладывать другой объект для GC, чтобы в конечном итоге собрать.

Я думаю, что создание нового StringBuilder было бы лучшим ударом для проблем памяти. и установка sb.Length будет лучшим ударом для проблем скорости.

Ответ 6

В .NET Framework 4 были введены новые методы в классе StringBuilder. Имя метода - "Очистить". Этот метод помогает очистить или удалить значения или данные из объектов StringBuilder.

Вот пример для этого.

    System.Text.StringBuilder objSB = new System.Text.StringBuilder();
    //Append values
    objSB.Append("This is .Net Blog.");
    objSB.Append("You can get latest C# Tips over here.");

    //Display on screen
    Response.Write(objSB.ToString());
    Response.Write("<br/><br/>");

    //Clear object using Clear method
    objSB.Clear();

    //Append another values
    objSB.Append("This blog is very useful for .Net Beginners");

    Response.Write("After Clear<br/><br/>");
    //Display on screen
    Response.Write(objSB.ToString());

Ответ 7

Если вы хотите уменьшить использование памяти, я бы использовал CLR Profiler для проверки того, сколько памяти ваши объекты StringBuilder используют в своем жизненном цикле, используя методы, описанные выше. Затем вы можете убедиться, что выбранный вами вариант подходит для ваших нужд и освобождает ресурсы, в которых вы нуждаетесь.

Ответ 8

Я бы сказал, что лучший способ его очистить - использовать sb = new StringBuilder();. При этом, я думаю, было бы еще лучше, если бы вы создали новый объект построителя строк вообще.

ИЗМЕНИТЬ

Надеюсь, само собой разумеется, что это лучшее решение.

public StringBuilder MakeString(IEnumerable<CoolType> list)
{
    StringBuilder sb = new StringBuilder();

    foreach(var whatever in list)
    {
        sb.Append("{0}", whatever);
    }
}

var sb = MakeString(whateverList);
// Do stuff
// Clear stuff
sb = MakeString(whateverList2);