лучший способ очистить содержимое .NET StringBuilder - PullRequest
67 голосов
/ 10 ноября 2009

Я хотел бы спросить, что, по вашему мнению, является лучшим способом (длится меньше / потребляет меньше ресурсов), чтобы очистить содержимое для повторного использования 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.

Ответы [ 11 ]

66 голосов
/ 10 ноября 2009

Если вы делаете это в .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.

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

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

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

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

15 голосов
/ 10 ноября 2009

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

10 голосов
/ 10 ноября 2009

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

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

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

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

10 голосов
/ 10 ноября 2009

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

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

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

5 голосов
/ 05 июля 2012

В .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());
2 голосов
/ 10 ноября 2009

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

1 голос
/ 10 ноября 2009

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

EDIT

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

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);
0 голосов
/ 30 марта 2019

C # В двух словах Очистить содержимое StringBuilder можно двумя способами:

  1. Установите его Length на ноль:

    Установка Length для StringBuilder на zero не уменьшает его внутреннюю емкость. Таким образом, если ранее StringBuilder содержал миллион символов, он будет продолжать занимать около 2 МБ памяти после обнуления его длины.

  2. Создать новый:

    Если вы хотите release the memory, вы должны создать новый StringBuilder и позволить старому выпадать из области видимости (и собирать мусор), с помощью этого подхода вы можете решить предыдущую проблему с предметом.

0 голосов
/ 24 августа 2018
// 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...