Класс StringBuilder. Методы класса StringBuilder. Примеры
Содержание
- 1. Особенности класса StringBuilder. Сравнение классов StringBuilder и String
- 2. В каком пространстве имен объявлен класс StringBuilder?
- 3. Операция присваивания = для класса StringBuilder
- 4. Операция присваивания одиночного символа по индексу в классах String и StringBuilder
- 5. Создание объекта класса StringBuilder. Примеры
- 6. Методы класса StringBuilder
- 6.1. Метод Append(). Добавить данные к текущему экземпляру
- 6.2. Изменение отдельного символа в строке. Доступ по индексу
- 6.3. Метод Insert(). Вставка строки в заданную позицию
- 6.4. Метод Remove(). Удаление из исходной строки диапазона символов
- 6.5. Метод Replace(). Заменяет символ/подстроку в исходной строке
- 6.6. Метод Clear(). Очистка строки
- 6.7. Метод CopyTo(). Копировать строку в массив типа char
- 6.8. Метод ToString(). Конвертировать строку типа StringBuilder в строку типа String
- 6.9. Свойства Length, Capasity, MaxCapasity
- Связанные темы
Поиск на других ресурсах:
1. Особенности класса StringBuilder. Сравнение классов StringBuilder и String
Как известно, в языке программирования C# для работы со строками введен тип string, который соответствует классу System.String или String. Однако, при интенсивной работе со строками более целесообразно использовать класс System.Text.StringBuilder, который обеспечивает более высокую производительность в сравнении с классом String.
Отличие между классами String и StringBuilder состоит в следующем.
В случае с классом String, когда выполняется операция присваивания =
// выделение памяти для строчного литерала "Text1" string s = "Text1"; // перераспределение памяти (выделение нового участка) s = "Text2";
память для нового строчного литерала («Text2») перераспределяется по новому: выделяется новый участок памяти, в который копируется новая измененная строка. Память, выделенная под предыдущий фрагмент, в дальнейшем уничтожается сборщиком мусора (Garbage collector).
В классе StringBuilder при изменении строки-оригинала, память для новой строки выделяется только в случае, когда размер новой строки больше размера строки-оригинала. При этом, памяти выделяется в два раза больше предыдущего размера. Если размер новой строки меньше или равен размеру строки-оригинала, то память не перераспределяется. Такой механизм позволяет повысить быстродействие за счет уменьшения интенсивности (количества) выделения новых ресурсов и освобождения использованных ресурсов.
Вывод: при интенсивной работе со строками рекомендуется использовать класс StringBuilder, в других случаях рекомендуется использовать класс String (или string).
⇑
2. В каком пространстве имен объявлен класс StringBuilder?
Чтобы использовать сокращенное имя класса StringBuilder нужно предварительно подключить пространство имен System.Text
using System.Text;
Однако, можно непосредственно обращаться к имени класса с помощью строки System.Text.StringBuilder.
⇑
3. Операция присваивания = для класса StringBuilder
В классе System.Text.StringBuilder оператор присваивания не определен. Поэтому, при объявлении объекта класса StringBuilder
StringBuilder sb = new StringBuilder();
использовать оператор присваивания = для присваивания объекту значения
sb = "Hello world!"; // Ошибка компиляции
не удастся. В этом случае компилятор выдаст ошибку
Cannot implicitly convert type 'string' to System.String.StringBuilder
⇑
4. Операция присваивания одиночного символа по индексу в классах String и StringBuilder
Между классами System.String и System.Text.StringBuilder существует отличие при использовании операции присваивания по индексу одиночного символа.
Переменной (объекту) типа String нельзя присваивать одиночный символ по индексу как показано ниже
string s = "Some text"; s[5] = 'n'; // ошибка компиляции
Одиночный символ можно только прочитать
string s = "Some text"; char c = s[5]; // работает, c = 't'
В отличие от типа String, для типа StringBuilder отдельный символ может быть изменен по его индексу. Например
StringBuilder sb = new StringBuilder("Some text"); sb[5] = 'n'; // работает
⇑
5. Создание объекта класса StringBuilder. Примеры
Класс StringBuilder имеет несколько конструкторов, которые выделяют память а также инициализируют экземпляры этого класса. Ниже приведены примеры создания экземпляров класса (объектов) StringBuilder
using System.Text; ... // 1. Создание объекта класса StringBuilder StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(10); // строка, длиной до 10 символов StringBuilder sb3 = new StringBuilder("Hello world!"); // константная строка ...
⇑
6. Методы класса StringBuilder
В данном разделе рассмотрены методы класса StringBuilder, используемые наиболее часто.
6.1. Метод Append(). Добавить данные к текущему экземпляру
Метод Append() предназначен для добавления копии экземпляра некоторого типа к текущему экземпляру. Метод имеет много перегруженных реализаций для разных типов.
Ниже приведены примеры некоторых реализаций метода Append().
// Метод Append() - добавить данные любого из стандартных типов // 1. Добавить строку типа string StringBuilder sb = new StringBuilder("Hello "); sb.Append("world!"); Console.WriteLine("sb = {0}", sb); // sb = Hello world! // 2. Добавить строку типа StringBuilder StringBuilder sb2 = new StringBuilder("abc"); StringBuilder sb3 = new StringBuilder("def"); sb2.Append(sb3); Console.WriteLine("sb2 = {0}", sb2); // sb2 = abcdef // 3. Добавить число типа double StringBuilder sb4 = new StringBuilder("Pi = "); double Pi = 3.141592; sb4.Append(Pi); Console.WriteLine("{0}", sb4); // Pi = 3.141592 // 4. Добавить переменную типа bool StringBuilder sb5 = new StringBuilder(); sb5.Append(true); Console.WriteLine("sb5 = {0}", sb5); // sb5 = True
⇑
6.2. Изменение отдельного символа в строке. Доступ по индексу
В отличие от типа string, в классе StringBuilder можно изменять отдельный символ по его индексу. Например.
// Изменить отдельный символ строки можно в отличие от типа String StringBuilder sb = new StringBuilder("Text."); sb[0] = 'N'; Console.WriteLine("sb = {0}", sb); // sb = Next.
⇑
6.3. Метод Insert(). Вставка строки в заданную позицию
Метод Insert() предназначен для вставки объектов разных типов в заданную позицию строки. Метод имеет много перегруженных реализаций. Во всех реализациях первый параметр метода задает позицию вставки.
Пример.
// Метод Insert() - вставка данных в исходную строку из заданной позиции // 1. Вставка объекта типа string StringBuilder sb1 = new StringBuilder("abcdef"); StringBuilder sb2 = sb1.Insert(1, "---"); Console.WriteLine("sb1 = {0}", sb1); // sb1 = a---bcdef Console.WriteLine("sb2 = {0}", sb2); // sb2 = a-- - bcdef // 2. Вставка объекта типа int StringBuilder sb3 = new StringBuilder("Max = "); sb3.Insert(sb3.Length, "256"); Console.WriteLine("{0}", sb3); // Max = 256 // 3. Вставка объекта типа double StringBuilder sb4 = new StringBuilder(); sb4.Insert(0, Math.PI); Console.WriteLine("Pi = {0}", sb4); // Pi = 3.141592653589793
⇑
6.4. Метод Remove(). Удаление из исходной строки диапазона символов
Метод Remove() используется для удаления из заданной строки диапазона символов начиная с заданной позиции. Метод получает два целочисленных параметра. Первый параметр указывает индекс начала, из которого удаляется строка. Второй параметр указывает количество удаляемых символов.
Пример.
// Метод Remove() - удаляет из исходной строки диапазон символов StringBuilder sb = new StringBuilder("abcdefghi"); sb.Remove(2, 3); // удалить "cde" Console.WriteLine("sb = {0}", sb); // sb = abfghi StringBuilder sb2 = new StringBuilder("01234567890"); sb2.Remove(0, 5); Console.WriteLine("sb2 = {0}", sb2); // sb2 = 567890
⇑
6.5. Метод Replace(). Заменяет символ/подстроку в исходной строке
Метод Replace() используется для замены подстроки в строке. Метод работает как для одиночных символов так и для строк. Метод имеет несколько перегруженных реализаций, среди которых выделяются четыре нижеследующие:
- замена одного символа типа char на другой символ типа char;
- замена одного символа типа char на другой символ типа char начиная с заданной позиции и в заданном диапазоне;
- замена одной строки типа string на другую строку типа string;
- замена одной строки типа string на другую строку типа string начиная с заданной позиции и в заданном диапазоне.
Пример.
// Метод Replace() - заменяет символ/подстроку в исходной строке // на заданный символ/подстроку // 1. Реализация Replace(char, char) - замена одного символа на другой StringBuilder sb = new StringBuilder("Solution"); sb.Replace('o', '+'); Console.WriteLine("sb = {0}", sb); // sb = S+luti+n // 2. Реализация Replace(char, char, int, int) StringBuilder sb2 = new StringBuilder("0123456789"); // Замена символа '2' на '0' // просмотр строки начинается с позиции 0 до позиции 3 sb2.Replace('2', '+', 0, 3); // sb2 = 01+3456789 Console.WriteLine("sb2 = {0}", sb2); // Записать в строку новое значение sb2.Clear(); sb2.Insert(0, "200+20+2=222"); // заменить в строке все символы '2' на символы '3' sb2.Replace('2', '3', 0, sb2.Length); Console.WriteLine("sb2 = {0}", sb2); // sb2 = 300+30+3=333 // 3. Реализация Replace(string, string) StringBuilder sb3 = new StringBuilder("abcdef abcdef"); sb3.Replace("bcd", "AAA"); // заменить все вхождения "bcd" на "AAA" Console.WriteLine("sb3 = {0}", sb3); // sb3 = aAAAef aAAAef // 4. Реализация Replace(string, string, int, int) StringBuilder sb4 = new StringBuilder("Hello Hello Hello"); sb4.Replace("Hello", "ABC", 0, sb4.Length); Console.WriteLine("sb4 = {0}", sb4); // sb4 = ABC ABC ABC sb4.Clear(); sb4.Append("1++2++3++4++5"); sb4.Replace("++", "--", 0, 7); // в диапазоне от 0 до 7 Console.WriteLine("sb4 = {0}", sb4); // sb4 = 1--2--3++4++5
⇑
6.6. Метод Clear(). Очистка строки
Метод Clear() реализует очистку строки (удаление всех символов в строке).
Пример.
// Метод Clear() - очистка строки StringBuilder sb = new StringBuilder("This is a string."); Console.WriteLine("sb = {0}", sb); // sb = This is a string. // очистить строку sb.Clear(); Console.WriteLine("sb = {0}", sb); // sb =
⇑
6.7. Метод CopyTo(). Копировать строку в массив типа char
Метод CopyTo() копирует символы из исходной строки в массив типа char (System.Char). Метод получает 4 параметра, которые имеют следующее назначение:
- позиция в исходной строке (тип int);
- массив-назначение (тип char[]) в который посимвольно записываются символы исходной строки;
- позиция в массиве-назначении (тип int) из которой начинается копирование символов из исходной строки;
- количество символов, которые копируются (тип int).
Пример.
// Метод CopyTo() - копирует символы исходной строки в массив типа Char StringBuilder sb = new StringBuilder("abcdef"); char[] arr = new char[5]; // выделить память для массива arr // скопировать фрагмент "bcd" в arr // Параметры: // 1 - исходная позиция в строке sb; // arr - массив-назначение в который копируются символы // 0 - позиция в arr, из которой записываются символы из sb // 3 - количество символов, которые копируются из sb в arr sb.CopyTo(1, arr, 0, 3); // arr = { 'b', 'c', 'd', '\0', '\0' } // скопировать фрагмент "cdef" в arr2 char[] arrC2 = new char[6]; sb.CopyTo(2, arrC2, 2, 4); // arrC2 = { '\0', '\0', 'c', 'd', 'e', 'f' } // Вывести строку arr2[] for (int i = 0; i < arrC2.Length; i++) { Console.WriteLine("arrc[{0}] = {1}", i, arrC2[i]); }
⇑
6.8. Метод ToString(). Конвертировать строку типа StringBuilder в строку типа String
Для конвертирования строки типа StringBuilder в строку типа String используется метод ToString(), который реализован в классе System.Object.
Согласно документации .NET Framework метод ToString() имеет две реализации общая форма которых следующая:
public override string ToString() public string ToString(int startIndex, int length)
В первой реализации происходит простое конвертирование строки типа StringBuilder в строку типа String. Во второй реализации копируется строка начиная с позиции startIndex длиной length символов.
Пример.
// Метод ToString() - конвертирует объект типа StringBuilder в String StringBuilder sb = new StringBuilder("Hello world!"); // Конвертирование строки полностью String s1 = sb.ToString(); Console.WriteLine("s1 = {0}", s1); // s1 = "Hello world!" // Конвертирование строки начиная с позиции 6, // количество копируемых символов равно 5 String s2 = sb.ToString(6, 5); // s2 = "world" Console.WriteLine("s2 = {0}", s2);
⇑
6.9. Свойства Length, Capasity, MaxCapasity
В классе StringBuilder реализованы три целочисленные свойства, которые определяют характеристики строки:
- Length – текущее количество символов в строке;
- Capasity – количество символов, которые можно поместить в строку без дополнительного выделения памяти;
- MaxCapasity – максимальное содержимое строки, которая может быть выделена.
Пример.
// Свойства Length, Capasity, MaxCapasity StringBuilder sb = new StringBuilder("12345"); int len, capasity, maxCapasity; // Length - текущее количество символов в строке len = sb.Length; // length = 5 // Capasity - количество символов, которые могут быть помещены в строку без // дополнительного выделения памяти capasity = sb.Capacity; // capasity = 16 // MaxCapasity - максимальное содержимое строки, которая может быть выделена maxCapasity = sb.MaxCapacity; // maxCapasity = 2147483647
⇑
Связанные темы
⇑