Поиск…


Что такое StringBuilder и когда использовать его

StringBuilder представляет серию символов, которые, в отличие от обычной строки, изменяемы. Часто бывает необходимо изменить строки, которые мы уже сделали, но стандартный строковый объект не изменен. Это означает, что каждый раз, когда строка изменяется, необходимо создать новый, строковый объект, скопировать в него и затем переназначить.

string myString = "Apples";
mystring += " are my favorite fruit";

В приведенном выше примере myString изначально имеет значение "Apples" . Однако, когда мы объединяем «мой любимый плод», то, что должен делать внутренний класс строки, включает в себя:

  • Создание нового массива символов, равного длине myString и новой строки, которую мы добавляем.
  • Копирование всех символов myString в начало нашего нового массива и копирование новой строки в конец массива.
  • Создайте новый строковый объект в памяти и переназначьте его в myString .

Для одного конкатенации это относительно тривиально. Однако, что делать, если нужно выполнить много операций добавления, например, в цикле?

String myString = "";
for (int i = 0; i < 10000; i++)
    myString += " "; // puts 10,000 spaces into our string

Благодаря многократному копированию и созданию объекта это значительно ухудшит производительность нашей программы. Мы можем избежать этого, используя StringBuilder .

StringBuilder myStringBuilder = new StringBuilder();    
for (int i = 0; i < 10000; i++)
    myStringBuilder.Append(' ');

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


Однако это не единственная оптимизация, которую имеет StringBuilder . Для дальнейшей оптимизации функций мы можем использовать другие свойства, которые помогают повысить производительность.

StringBuilder sb = new StringBuilder(10000); // initializes the capacity to 10000

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

sb.Append('k', 2000);

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

После того, как вы завершили построение своей строки, вы можете использовать метод ToString() в StringBuilder чтобы преобразовать его в базовую string . Это часто необходимо, потому что класс StringBuilder не наследует string .

Например, вот как вы можете использовать StringBuilder для создания string :

string RepeatCharacterTimes(char character, int times)
{
    StringBuilder builder = new StringBuilder("");
    for (int counter = 0; counter < times; counter++)
    {
        //Append one instance of the character to the StringBuilder.
        builder.Append(character);
    }
    //Convert the result to string and return it.
    return builder.ToString();
}

В заключение, StringBuilder следует использовать вместо строки, когда необходимо внести множество изменений в строку с учетом производительности.

Используйте StringBuilder для создания строки из большого количества записей

public string GetCustomerNamesCsv()
{
    List<CustomerData> customerDataRecords = GetCustomerData(); // Returns a large number of records, say, 10000+

    StringBuilder customerNamesCsv = new StringBuilder();
    foreach (CustomerData record in customerDataRecords)
    {
       customerNamesCsv
           .Append(record.LastName)
           .Append(',')
           .Append(record.FirstName)
           .Append(Environment.NewLine);
    }

    return customerNamesCsv.ToString();
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow