Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Роль System.Text.StringBuilder
Роль System.Text.StringBuilder
Тип string прекрасно подходит для того, чтобы представлять базовые строковые переменные (имя, SSN и т.п.), но этого может оказаться недостаточно, если вы создаете программу, в которой активно используются текстовые данные. Причина кроется в одной очень важной особенности строк в .NET: значение строки после ее определения изменить нельзя. Строки в C# неизменяемы.
На первый взгляд, это кажется невероятным, поскольку мы привыкли присваивать новые значения строковым переменным. Однако, если проанализировать методы System.String, вы заметите, что методы, которые, как кажется, внутренне изменяют строку, на самом деле возвращают измененную копию оригинальной строки. Например, при вызове ToUpper() для строкового объекта вы не изменяете буфер существующего строкового объекта, а получаете новый строковый объект в форме символов верхнего регистра.
static void Main(string[] args) {
…
// Думаете, что изменяете strFixed? А вот и нет!
System.String strFixed = "Так я начинал свою жизнь";
Console.WriteLine(strFixed);
string upperVersion = strFixed.ToUpper();
Console.WriteLine(strFixed);
Console.WriteLine("{0}nn", upperVersion);
…
}
Подобным образом, присваивая существующему строковому объекту новое значение, вы фактически размещаете в процессе новую строку (оригинальный строковый объект в конечном итоге будет удален сборщиком мусора). Аналогичные действия выполняются и при конкатенации строк.
Чтобы уменьшить число копирований строк, в пространстве имен System.Text определяется класс StringBuilder (он уже упоминался нами выше при рассмотрении System.Object). В отличие от System.String, тип StringBuilder обеспечивает прямой доступ к буферу строки. Подобно System.String, тип StringBuilder предлагает множество членов, позволяющих добавлять, форматировать, вставлять и удалять данные (подробности вы найдете в документации .NET Framework 2.0 SDK).
При создании объекта StringBuilder можно указать (через аргумент конструктора) начальное число символов, которое может содержать объект. Если этого не сделать, то будет использоваться "стандартная емкость" StringBuilder, по умолчанию равная 16. Но в любом случае, если вы увеличите StringBuilder больше заданного числа символов, то размеры буфера будут переопределены динамически.
Вот пример использования этого типа класса.
using System;
using System.Text; // Здесь 'живет' StringBuilder.
class StringApp {
static void Main(string[] args) {
StringBuilder myBuffer = new StringBuilder("Моя строка");
Console.WriteLine("Емкость этого StringBuilder: {0}", myBuffer.Capacity);
myBuffer.Append(" содержит также числа:");
myBuffer.AppendFormat("{0}, {1}.", 44, 99);
Console.WriteLine("Емкость этого StringBuilder: {0}", myBuffer.Сарасitу);
Console.WriteLine(myBuffer);
}
}
Во многих случаях наиболее подходящим для вас текстовым объектом будет System.String. Для большинства приложений потери, связанные с возвращением измененных копий символьных данных, будут незначительными. Однако при построении приложений, интенсивно использующих текстовые данные (например, текстовых процессоров), вы, скорее всего, обнаружите, что использование System.Text.StringBuilder повышает производительность.
Исходный код. Проект Strings размешен в подкаталоге, соответствующем главе 3.
- Структура простой программы на C#
- Несколько слов о классе System.Environment
- Определение классов и создание объектов
- Класс System.Console
- Доступность членов
- Значения, назначаемые переменным по умолчанию
- Синтаксис инициализации членов-переменных
- Определение констант
- Определение полей только для чтения
- Ключевое слово static
- Модификаторы параметров методов
- Итерационные конструкции
- Конструкции выбора решений и операции сравнения
- Типы, характеризуемые значениями, и ссылочные типы
- Операции создания объектного образа и восстановления из объектного образа
- Работа с перечнями .NET
- Мастер-класс: System.Object
- Переопределение элементов System.Object, заданных по умолчанию
- Типы данных System (и их обозначения в C#)
- Тип данных System.String
- Роль System.Text.StringBuilder
- Типы массивов .NET
- Типы с разрешением принимать значение null
- Пользовательские пространства имен
- Резюме
- Тип данных System.String
- Роль товарной категории и установление цены
- Роль папки Bin
- System tools used for debugging
- Integrated Secure Communications System
- Контрольные вопросы
- Texture Size
- Глава 14. Почему потребительский опыт играет важную роль в выстраивании клиентских взаимоотношений
- Запуск сценариев на удаленных машинах. Контроль за ходом выполнения таких сценариев
- З.1.2. Пароль BIOS не сбрасывается даже при удалении батарейки. Почему?
- Не хочу, чтобы компьютером пользовались в мое отсутствие. Как установить пароль и блокировать машину?
- Где лучше хранить свой пароль?