Класс StringBuilder

24

Когда строка конструируется классом String, выделяется ровно столько памяти, сколько необходимо для хранения данной строки. Однако, в пространстве имен System.Text имеется класс StringBuilder, который поступает лучше и обычно выделяет больше памяти, чем нужно в данный момент. У вас, как разработчика, есть возможность указать, сколько именно памяти должен выделить StringBuilder, но если вы этого не сделаете, то будет выбран объем по умолчанию, который зависит от размера начального текста, инициализирующего экземпляр StringBuilder. Класс StringBuilder имеет два главных свойства:

Любые модификации строки происходят внутри блока памяти, выделенного экземпляру StringBuilder. Это делает добавление подстрок и замену индивидуальных символов строки очень эффективными. Удаление или вставка подстрок неизбежно остаются менее эффективными, потому что при этих операциях приходится перемещать в памяти части строки. Выделять новую память и, возможно, полностью перемещать ее содержимое приходится только при выполнении ряда действий, которые приводят к превышению выделенной емкости строки. В дополнение к избыточной памяти, выделяемой изначально на основе экспериментов, StringBuilder имеет свойство удваивать свою емкость, когда происходит переполнение, а новое значение емкости не установлено явно.

Рассмотрим пример:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder hello = new StringBuilder("Привет, меня зовут Александр Ерохин",120);
            hello.AppendFormat("Я рад вас приветствовать на моем сайте professorweb.ru");
        }        
    }
}

В данном примере начальная емкость StringBuilder равна 120. Всегда лучше сразу указывать емкость, превышающую предполагаемую длину строки, чтобы объекту StringBuilder не приходилось заново выделять память при переполнении. По умолчанию устанавливается емкость в 16 символов. Схематически данный пример работает следующим образом:

Принцип работы StringBuilder

Т.е. при вызове метода AppendFormat() остаток текста помещается в пустое пространство без необходимости перераспределения памяти. Однако реальная эффективность, которую несет с собой применение StringBuilder, проявляется при выполнении повторных подстановок текста.

В следующей таблице перечислены основные методы класса StringBuilder:

Методы класса StringBuilder
Метод Назначение
Append() Добавляет строку к текущей строке
AppendFormat() Добавляет строку, сформированную в соответствии со спецификатором формата
Insert() Вставляет подстроку в строку
Remove() Удаляет символ из текущей строки
Replace() Заменяет все вхождения символа другим символом или вхождения подстроки другой подстрокой
ToString() Возвращает текущую строку в виде объекта System.String (переопределение метода класса System.Object)

Давайте рассмотрим практический пример использования класса StringBuilder:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder hello = new StringBuilder("Привет, меня зовут Александр Ерохин",120);
            hello.AppendFormat(" Я рад вас приветствовать на моем сайте professorweb.ru");
            // Зашифруем строку, хранящуюся в переменной hello
            Console.WriteLine("Исходная строка: \n {0}\n",hello);

            for (int i = 'я'; i >= 'a'; i--)
                hello = hello.Replace((char)i,(char)(i+3));
            

            Console.WriteLine("Зашифрованная строка:\n {0}",hello);

            Console.ReadLine();
        }        
    }
}
Использование класса StringBuilder
Пройди тесты
Лучший чат для C# программистов