Клас 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, коли виконується операція присвоювання =
// виділення пам'яті для рядкового літералу "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[] arrC = new char[5]; // виділити пам'ять для масиву arrC // скопіювати фрагмент "bcd" в arrC // Параметри: // 1 - вихідна позиція в рядку sb; // arrC - масив-призначення, куди копіюються символи // 0 - позиція в arrC, з якої записуються символи з sb // 3 - кількість символів, які копіюються з sb в arrC sb.CopyTo(1, arrC, 0, 3); // arrC = { 'b', 'c', 'd', '\0', '\0' } // скопіювати фрагмент "cdef" в arrC2 char[] arrC2 = new char[6]; sb.CopyTo(2, arrC2, 2, 4); // arrC2 = { '\0', '\0', 'c', 'd', 'e', 'f' } // Вивести рядок arrC2[] 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. Клас System.Object є базовим для всіх класів у C#, тому клас StringBuilder успадковує метод ToString().
Згідно документації .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
⇑
Зв’язані теми
⇑