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

5.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, тут допускається не тільки читання окремого символу, але і його зміна.

Приклад:

using System;

using System.Collections.Generic;

using System.Text;

namespace String3

{

class Program

{

static void Main(string[] args)

{

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

StringBuilder s1 = new StringBuilder("ABC"),

s2 = new StringBuilder("CDE");

StringBuilder s3 = new StringBuilder();

s3 = s1.Append(s2); //s3= s1+s2;

bool b1 = (s1 == s3);

char ch1 = s1[0], ch2 = s2[0];

Console.WriteLine("s1={0}, s2={1}, b1={2}," +

"ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

s2 = s1;

b1 = (s1 != s2);

ch2 = s2[0];

Console.WriteLine("s1={0}, s2={1}, b1={2}," +

"ch1={3}, ch2={4}", s1, s2, b1, ch1, ch2);

StringBuilder s = new StringBuilder("Zenon");

s[0] = 'L';

Console.WriteLine(s);

}

}

}

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

Рис.5.2 - Результати роботи програми

Основні методи і властивості

У класу є основні методи, що дозволяють виконувати такі операції над рядком як вставка, видалення та заміна підрядків, але немає методів, подібних до пошуку входження, які можна виконувати над звичайними рядками. Технологія роботи звичайно така: конструюється рядок класу 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 len). Метод видаляє підрядок довжини len, що починається з позиції start;

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

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

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

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

int k=s.Length;

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

StringBuilder s1=new StringBuilder("Cogito ");

StringBuilder s2=new StringBuilder("ergo ");

s1.Append(s2);

s1.Append("sum");

System.Console.WriteLine(s1);

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

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

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

if(s1.Equals(s2)) System.Console.WriteLine("Рядки рівні");

else

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

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

StringBuilder s1=new StringBuilder("abcde");

s1.Insert(2, "xyz");

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

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

StringBuilder s1=new StringBuilder("abcde");

s1.Remove(1, 2);

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

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

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

StringBuilder s=new StringBuilder("abcdeabcde");

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

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

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

Ємність буфера

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

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

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

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

System.Console.WriteLine(s.MaxCapacity);

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