Возможности, предоставляемые классом 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, а затем перейдем к новым элементам класса — индексаторам, операциям и деструкторам.