Строки типа StringBuilder

Возможности, предоставляемые классом string, широки, однако требование не­изменности его объектов может оказаться неудобным. В этом случае для работы со строками применяется класс StringBuilder, определенный в пространстве имен System.Text и позволяющий изменять значение своих экземпляров.

При создании экземпляра обязательно использовать операцию new и конструк­тор, например:

StringBuilder a = new StringBuilder(); // 1

StringBuilder b = new StringBuilder("qwerty"); //2

StringBuilder с = new StringBuilder(100); // 3

StringBuilder d = new StringBuilder("qwerty". 100); // 4

StringBuilder e = new StringBuilder("qwerty", 1. 3, 100); // 5

В конструкторе класса указываются два вида параметров: инициализирующая строка или подстрока и объем памяти, отводимой под экземпляр (емкость буфе­ра). Один или оба параметра могут отсутствовать, в этом случае используются их значения по умолчанию.

Если применяется конструктор без параметров (оператор 1), создается пустая строка размера, заданного по умолчанию (16 байт). Другие виды конструкторов задают объем памяти, выделяемой строке, и/или ее начальное значение. На­пример, в операторе 5 объект инициализируется подстрокой длиной 3 символа, начиная с первого (подстрока "wer"). Основные элементы класса StringBuilder приведены в табл. 6.5.

Таблица 6.5. Основные элементы класса System.Text.StringBuilder
Название Вид_ Описание

Append Метод Добавление в конец строки. Разные варианты метода позволяют

добавлять в строку величины любых встроенных типов, массивы

символов, строки и подстроки типа string

AppendFormat Метод Добавление форматированной строки в конец строки
Capacity Свойство Получение или установка емкости буфера. Если

устанавливаемое значение меньше текущей длины строки или

больше максимального, генерируется исключение

ArgumentOutOfRangeException

Insert Метод Вставка подстроки в заданную позицию

Length Свойство Длина строки (количество символов)

MaxCapacity Свойство Максимальный размер буфера

Remove Метод Удаление подстроки из заданной позиции

Replace Метод Замена всех вхождений заданной подстроки или символа

новой подстрокой или символом
ToString Метод Преобразование в строку типа string

Пример применения методов приведен в листинге 6.9.

Листинг 6.9. Работа со строками типа StringBuilder

using System;

using System.Text;

namespace ConsoleApplication1

{

class Class1

{

static void Main()

{

Console.Wnte("Введите зарплату; ");

double salary = double.Parse(Console.ReadLine());

StringBuilder a = new StringBuilder();

a.Append("зарплата ");

a.AppendFormat("{0, 6:C} - в год {1. 6:C}".

salary, salary * 12);

Console.WnteLine(a);

a.Replace("p.", "тыс.$");

Console.WriteLine("А лучше было бы; " + a);

}

}

}

Результат работы программы:

Введите зарплату; 3500

зарплата 3 500.00р. - в год 42 000.00р.

А лучше было бы; зарплата 3 500.00тыс.$ - в год 42 000.00 тыс.$

Емкость буфера не соответствует количеству символов в строке и может увеличи­ваться в процессе работы программы как в результате прямых указаний програм­миста, так и вследствие выполнения методов изменения строки, если строка в ре­зультате превышает текущий размер буфера. Программист может уменьшить размер буфера с помощью свойства Capacity, чтобы не занимать лишнюю память.

Класс Random

При отладке программ, использующих массивы, удобно иметь возможность ге­нерировать исходные данные, заданные случайным образом. В библиотеке С# на этот случай есть класс Random, определенный в пространстве имен System.

Для получения псевдослучайной последовательности чисел необходимо сначала создать экземпляр класса с помощью конструктора, например:

Random a = new Random(); // 1

Random b = new Random(1); // 2

Есть два вида конструктора: конструктор без параметров (оператор 1) исполь­зует начальное значение генератора, вычисленное на основе текущего времени. В этом случае каждый раз создается уникальная последовательность. Конструк­тор с параметром типа int (оператор 2) задает начальное значение генерато­ра, что обеспечивает возможность получения одинаковых последовательно­стей чисел.

Для получения очередного значения серии пользуются методами, перечислен­ными в табл. 6.6.

Таблица 6.6. Основные методы класса System.Random
Название Описание

Next() Возвращает целое положительное число во всем положительном

диапазоне типа int

Next(макс) Возвращает целое положительное число в диапазоне [0, макс]

Next (мин, макс) Возвращает целое положительное число в диапазоне [мин, макс] NextBytes(массив) Возвращает массив чисел в диапазоне [0, 255]

NextDouble() Возвращает вещественное положительное число в диапазоне [0, 1)

Пример применения методов приведен в листинге 6.10.

Листинг 6.10. Работа с генератором псевдослучайных чисел

using System;

namespace ConsoleApplication1

{

class Class1

{

static void Main()

{

Random a = new Random();

Random b = new Random(1);

const int n = 10;

Console.WriteLine("\n Диапазон [0, 1]:");

for (int i = 0; i < n; ++i)

Console.Wnte("{0.6:0.##}", a.NextDouble());

Console.WriteLine("\n Диапазон [0. 1000]:");

for (int i = 0; i < n; ++i)

Console.Write(" " + b.Next(1000));

Console.WriteLine("\n Диапазон [-10. 10]:");

for (int i = 0; i < n; ++i)

Console.Write(" " + a.Next(-10, 10));

Console.WriteLine("\n Массив [0. 255]:");

byte[] mas = new byte[n];

a.NextBytes(mas);

for (int i = 0; i < n; ++i) Console.Write(" " + mas[i]);

}

}

}

Результат работы программы:

Диапазон [0, 1]:

0.02 0.4 0.24 0.55 0,92 0.84 0.9 0.78 0.78 0.74

Диапазон [0, 1000]:

248 ПО 467 771 657 432 354 943 101 642

Диапазон [-10, 10]:

-8 9 -6 -10 7 4 9 -5 -2 -1

Массив [0. 255]:

181 105 60 50 70 77 9 28 133 150

Рекомендации по программированию

Используйте для хранения данных массив, если количество однотипных элемен­тов, которые требуется обработать в вашей программе, известно или, по крайней мере, известно максимальное количество таких элементов. В последнем случае память под массив выделяется «по максимуму», а фактическое количество эле­ментов хранится в отдельной переменной, которая вычисляется в программе.

При работе с массивом нужно обязательно предусматривать обработку ис­ключения IndexOutOfRangeException, если индекс для обращения к массиву вы­числяется в программе по формулам, а не задается с помощью констант или счетчиков циклов for.

СОВЕТ

При отладке программ, использующих массивы, исходные данные удобно подго­товить в текстовом файле. Это позволит продумать, какие значения элементов необходимо задать, чтобы протестировать выполнение каждой ветви программы. Например, исходные данные для программы, вычисляющей в одномерном массиве номер первого элемента, равного нулю, должны включать варианты, когда такой элемент встречается в массиве ни одного, один и более раз.

Если количество элементов, обрабатываемых программой, может быть произволь­ным, удобнее использовать не массив, а другие структуры данных, например па­раметризованные коллекции, которые рассматриваются в главе 13.

При работе со строками необходимо учитывать, что в С# строка типа string яв­ляется неизменяемым типом данных, то есть любая операция изменения строки на самом деле возвращает ее копию. Для изменения строк используется тип StringBuilder. Прежде чем описывать в программе какое-либо действие со стро­ками, полезно посмотреть, нет ли в списке элементов используемого класса под­ходящих методов и свойств.

Для эффективного поиска и преобразования текста в соответствии с заданными шаблонами используются так называемые регулярные выражения, которые рас­смотрены в главе 15.

Классы: подробности I

В этой главе мы продолжим знакомство с элементами классов, начатое в главе 5. Сначала мы рассмотрим дополнительные возможности методов, не описанные в главе 5, а затем перейдем к новым элементам класса — индексаторам, операци­ям и деструкторам.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: