C#. Клас StringBuilder. Методи класу StringBuilder. Приклади




Клас StringBuilder. Методи класу StringBuilder. Приклади


Зміст


Пошук на інших ресурсах:

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

 


Зв’язані теми