лучший способ очистить содержимое .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;

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

Спасибо.

РЕДАКТИРОВАТЬ: я с текущей версией .NET 3.5.

 supercat14 авг. 2012 г., 19:26
интересно, почемуLength доступно для записи, но нетчтение / запись "Текст" имущество? поговоркаsb.Text = ""; Казалось бы, яснее, чтоsb.Length = 0;иText свойство также поможет в общем сценарии, где в противном случае придется сказать.sb.Length = 0; sb.Append(StuffToStartWith);
 Philip Wallace10 нояб. 2009 г., 18:01
Не ответ, но интересно читать:bobondevelopment.com/2007/06/11/...
 Rune FS10 нояб. 2009 г., 22:54
Какие'причина не включать метод StringBuilder.Clear () в качестве альтернативы?
 Rune FS16 апр. 2010 г., 07:05
повезло, что вышел c # 4.0blogs.msdn.com/somasegar/default.aspx
 supercat01 июл. 2018 г., 20:38
@LWChris: было бы разумно потребовать, чтобы код, желающий установить контент, использовалSet метод, а не свойство, но если кто-то такой подход, я не вижу причинLength не должен»не должны подходить, особенно если учесть, что будут использоваться различные способы обработки сценариев удлинения и сокращения.
 LWChris01 июл. 2018 г., 18:42
@supercat Наверное, потому что.Text собственность побуждает людей случайно писатьsb.Text = sb.Text + nextString;, победив весь смысл использованияStringBuilder на первом месте.
 jcollum15 апр. 2010 г., 23:15
@Rune: c # 4.0пока нет, этотолько в 4.0. На MSDN написано: Поддерживается в: 4.

Ответы на вопрос(10)

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

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

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

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

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

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

РЕДАКТИРОВАТЬ

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

public StringBuilder MakeString(IEnumerable 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);
 Paul Sonier10 нояб. 2009 г., 18:05
Это делает вообще новый объект для построения строк.
 Dan Tao10 нояб. 2009 г., 18:07
Я думаю, что Мэтт означает объявить новую переменную ДЛЯ нового.StringBuilder
 Philip Wallace10 нояб. 2009 г., 18:04
sb = new StringBuilder () IS создает новый объект строителя строки.
 Matt Grande10 нояб. 2009 г., 18:14
Извините, чтобы царапать яЯ рекомендую сделать что-то вроде этого: var wellNamedStringBuilder = new StringBuilder ();

Из контента сообщества наMSDN:

Чтобы эффективно очистить ваш stringbuilder, не разрушая его, используйте:

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

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

Решение Вопроса

Если ты'Делая это в .NET 2.0 или 3.5, напишите метод расширения, чтобы сделать это так:

/// 
///     Clears the contents of the string builder.
/// 
/// 
///     The  to clear.
/// 
public static void Clear(this StringBuilder value)
{
    value.Length = 0;
    value.Capacity = 0;
}

Затем вы можете очистить это так:

someStringBuilder.Clear();

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

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

Установите его в 1 или ноль, чтобы очистить памятьУстановите его в исходное значение емкости (которое может отличаться от 16), чтобы восстановить его.
 Peter Huber12 апр. 2015 г., 02:06
Установка емкости на 0 - интересная идея. Когда используется только Clear или просто устанавливается длина 0, утечка памяти может возникать при многократном использовании Insert (), потому что Capacity продолжает расти, несмотря на Clear. (см. мой вопрос:stackoverflow.com/questions/29574469/...
 abhi17 сент. 2010 г., 15:50
Аккуратный метод. Как раз то, что я искал.
 supercat14 авг. 2012 г., 19:31
Я бы рекомендовал не очищать емкость, кроме случаев, когдаStringBuilder как известно, что-то держалнеобычно большой. Особенно в более ранних версиях .net, если каждый будет многократно создавать строки длиной более 42 500 символов, очистка буфера после каждой строки приведет к тому, что дополнительные объекты будут размещаться в куче больших объектов каждый раз, когда буфер будет перераспределяться. Тот'плохая вещь.

Просто вызовите метод Clear (), просто установите длину = 0, мы также можем установить Capacity = 0, если мы хотим сохранить память

public StringBuilder Clear() {
        this.Length = 0;
        return this;
 }

Ссылка: Вreferencesource.microsoft.com

// P.S. to be ultra efficient 
// make a good guess at the initial allocation too !!!!
int PerWhatever_SizeEstimate = 4; // a guess of average length... you known your data
StringBuilder sb = new StringBuilder( whateverlist.Length * PerWhatever_SizeEstimate);

// reallocation needed? 
// if you want to be efficient speed and memory wise... 
sb.Length = 0;  // rest internal index but don't release/resize memory
// if a ...BIG... difference in size
if( whatever2.Length < whatever.Length * 2/3  
 || whatever2.Length > whatever.Length * 1.5)
{
    //scale capacity appropriately
    sb.Capaciy = sb.Capacity * whatever2.Length / whatever.Length;
}

В .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());

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

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

 Earlz10 нояб. 2009 г., 18:08
зависит от того, насколько велика строка, созданная в первый раз, по сравнению со строкой, созданной во второй раз. Или, по крайней мере, я так думаю
 GraemeF10 нояб. 2009 г., 18:07
Если ты'повторное его использование не будетВы хотите повторно использовать буфер?
 Philip Wallace10 нояб. 2009 г., 18:01
Установите емкость на ноль также ...

Ваш ответ на вопрос