Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_2_1_2б символы и строки.doc
Скачиваний:
2
Добавлен:
17.11.2019
Размер:
157.18 Кб
Скачать

3.5. Клас StringBuilder

Клас StringBuilder - побудовник рядків. Клас String не дозволяє змінювати існуючі об'єкти. Рядковий клас StringBuilder дозволяє ком­пенсувати цей недолік. Цей клас належить до змінюваних класів і його можна знайти в просторі імен System.Text.

Оголошення рядків. Конструктори класу StringBuilder.

Об'єкти цього класу оголошуються з явним викликом конструктора класу. Оскільки спеціальних констант цього типу не існує, то виклик конс­труктора для ініціалізації об'єкта необхідний. Конструктор класу пере­вантажений, і поряд з конструктором без параметрів, що створюють порожній рядок, є набір конструкторів, яким можна передати дві групи параметрів. Перша група дозволяє задати рядок або підрядок, значен­ням якого буде ініціалізуватися створюваний об'єкт класу StringBuilder. Друга група параметрів дозволяє задати розмір об'єкта - обсяг пам'яті, що відводиться даному екземпляру класу StringBuilder. Кожна із цих груп не є обов'язковою й може бути опущена. Прикладом може служити конструктор без параметрів, що створює об'єкт, ініціалізований поро­жнім рядком, і з деяким розміром, заданим за замовчуванням, значення якого залежить від реалізації. Приклад синтаксису конструкторів:

public StringBuilder (string str, int cap).

Параметр str задає рядок ініціалізації, cap - розмір об'єкта;

public StringBuilder (int curcap, int maxcap).

Параметри curcap й maxcap задають початковий і максималь­ний розмір об'єкта;

public StringBuilder (string str, Int start, int len, Int cap).

Параметри str, start, len задають рядок ініціалізації, cap – розмір об'єкта.

Для цього класу не можна використовувати просте присвоювання: StringBuilder s="abc"; // Неправильної

У цьому випадку необхідно записати так:

StringBuilder s = new StringBuilder("abc"); // Правильно

Операції над рядками. Над рядками цього класу визначені практично ті ж операції з тією ж семантикою, що й над рядками класу String, однак, операція конкатенації (+) не визначена над рядками класу StringBuilder, її роль грає метод Append, що дописує новий рядок в кі­нець уже існуючого.

З рядком цього класу можна працювати як з масивом, але, на відміну від класу String, тут допускається не тільки читання окремого символу, але і його зміна.

Приклад

// Рядки класу StringBuilder. Операції над рядками

StringBuilder ss1 = new StringBuilder("ABC"),

ss2 = new StringBuilder("CDE");

StringBuilder ss3 = new StringBuilder();

ss3 = ss1.Append(ss2); // s3= s1+s2;

bool bs1 = (ss1 == ss3);

char chs1 = s1[0], chs2 = ss2[0];

Console.WriteLine("\nss1={0}, ss2={1}, bs1={2}, chs1={3}, chs2={4}",

ss1, ss2, bs1, chs1, chs2);

ss2 = ss1;

bs1 = (ss1 != ss2);

chs2 = ss2[0];

Console.WriteLine("ss1={0}, ss2={1}, bs1={2},chs1={3}, chs2={4}",

ss1, ss2, bs1, chs1, chs2);

StringBuilder ss = new StringBuilder("Zenon");

ss[0] = 'L';

Console.WriteLine(ss);

Цей приклад демонструє можливість виконання над рядками класу StringBuilder тих же операцій, що й над рядками класу String. У результаті присвоювання створюється додаткове посилання на об'єкт, операції перевірки на еквівалентність працюють зі значеннями рядків, а не з посиланнями на них. Конкатенацію можна замінити викликом методу Append. З'являється нова можливість – змінювати окремі сим­воли рядка. Для того, щоб ім'я класу StringBuilder стало доступним, у проект доданий рядок using System.Text, що посилається на відповідний простір імен. Результати роботи наведені нижче:

ss1=ABCCDE, ss2=CDE, bs1=True, chs1=A, chs2=C

ss1=ABCCDE, ss2=ABCCDE, bs1=False,chs1=A, chs2=A

Lenon

Основні методи і властивості. У класу є основні методи, що дозволяють виконувати такі операції над рядком як вставка, видалення та заміна підрядків, але немає методів, подібних до пошуку входження, які можна виконувати над звичайними рядками. Технологія роботи звичайно така: конструюється рядок класу StringBuilder; виконуються операції, що вимагають зміни значення; отриманий рядок перетво­риться в рядок класу String; над цим рядком виконуються операції, що не вимагають зміни значення рядка. У класу StringBuilder немає статич­них методів. Всі його методи динамічні.

Основні методи класу StringBuilder:

- public StringBuilder Append (<об'єкт>). До рядка, який ви­кликав метод, приєднується рядок, отриманий з об'єкта, що переданий методу як параметр. Метод перевантажений і може приймати на вході об'єкти всіх простих типів, починаючи від char й bool до string й long. Оскільки об'єкти всіх цих типів мають метод ToString, завжди є мож­ливість перетворити об'єкт у рядок, який і приєднується до вихідного рядка. Як результат повертається посилання на об'єкт, що викликав метод. Оскільки повернене посилання нічому присвоювати не потрібно, то вірніше вважати, що метод змінює значення рядка;

- public StringBuilder Insert (int location,<обєкт>). Метод вставляє рядок, отриманий з об'єкта, у позицію, зазначену параметром location. Метод Append є частковим випадком методу Insert;

- public StringBuilder Remove (int start, int leri). Метод видаляє підрядок довжини lеn, що починається з позиції start;

- public StringBuilder Replace (string strl, string str2). Всі вхо­дження підрядка strl заміняються на рядок str2;

- public StringBuilder AppendFormat (<рядок форматів>, „об’єкти”). Метод є комбінацією методу Format класу String і методу Append. Рядок форматів, переданий методу, містить тільки специфіка­ції форматів. Відповідно до цих специфікацій знаходяться і форматуються об'єкти. Отримані в результаті форматування рядки приєдну­ються в кінець вихідного рядка.

Приклади використання основних властивостей і методів класу StringBuilder:

//Властивість Length. Повертає довжину рядка:

int k=s.Length;

//Метод Append. Додає рядок до існуючого:

StringBuilder sb1=new StringBuilder("Cogito ");

StringBuilder sb2=new StringBuilder("ergo ");

sb1.Append(s2);

sb1.Append("sum");

Console.WriteLine();

Console.WriteLine(sb1);

// Надрукується "Cogito ergo sum"

// Я мислю, значить я існую

//Метод Equals. Слугує для порівняння двох рядків. Повертає true або false.

if(sb1.Equals(sb2)) Console.WriteLine("Рядки рівні");

else Console.WriteLine("Рядки не рівні");

//Метод Insert. Вставляє символи в задану позицію (нумерація йде з нуля):

StringBuilder sb3=new StringBuilder("abcde");

sb3.Insert(2, "xyz");

Console.WriteLine(sb3); // Надрукується "abxyzcde"

//Метод Remove. Видаляє символи з рядка:

StringBuilder sb4=new StringBuilder("abcde"); sb4.Remove(1, 2);

Console.WriteLine(sb4); // Надрукується "ade"

Console.ReadKey();

Перший параметр в Remove визначає, з якої позиції видаляти (нумерація з нуля), другий - скільки символів видаляти.

Метод Replace. Заміняє символи:

StringBuilder sr = new StringBuilder("abcdeabcde");

sr.Replace("abc", "ZZZ");

Console.WriteLine(sr); // Надрукується "ZZZdeZZZde"

За винятком методу Remove, всі розглянуті методи є переван­таженими.

Ємність буфера. Кожен екземпляр рядка класу StringBuilder має буфер, у якому зберігається рядок. Обсяг буфера – його ємність – може мінятися в процесі роботи з рядком. Об'єкти класу мають дві характеристики ємності – поточну й максимальну. У процесі роботи поточна ємність змінюється в межах максимальної ємності. Якщо роз­мір рядка збільшується, то відповідно автоматично росте й поточна ємність. Якщо ж розмір рядка зменшується, то ємність буфера залиша­ється на тому ж рівні. Із цієї причини іноді правильно зменшувати єм­ність. Спроба зменшити ємність до величини, меншої довжини рядка, Веде ДС' помилки.

У класу StringBuilder є дві властивості та один метод, що доз­воляють аналізувати й керувати ємнісними властивостями буфера. Цими характеристиками можна керувати також ще на етапі створення об'єкта, – для цього є відповідний конструктор. Розглянемо властивості і метод класу, пов'язані з ємністю буфера:

- властивість Capacity – повертає або встановлює поточну єм­ність буфера;

- властивість MaxCapaclty – повертає максимальну ємність бу­фера (максимальна кількість символів, які можна записати в об'єкт типу StringBuilder).

Метод int EnsureCapacity (int capacity) – дозволяє зменшити єм­ність буфера. Метод намагається спочатку встановити ємність, задану параметром capacity; якщо це значення менше розміру збереженого рядка, то ємність установлюється такою, щоб гарантувати розміщення рядка. Це число повертається як результат роботи методу.

9