Работа со строками в .NET
Страница 3. Динамическое формирование строк


Динамическое формирование строк

Прочитав о неизменяемых строках, Вы, возможно, задаетесь вопросом: как формировать строки динамически? Тип System.Text.StringBuilder решает поставленную задачу. У него есть поле с внутренним массивом символов и набор методов, позволяющих эффективно манипулировать содержимым этого массива. Приэтом не нужно заботиться о размере массива символов – при необходимости StringBuilder сам создаст новый массив и скопирует в него символы.

Особого внимания заслуживает метод ToString,который возвращает экземпляр типа System.String для построения которого и предназначен StringBuilder. При вызове этого метода объект StringBuilder просто возвращает ссылку на свой массивсимволов, поэтому вызов происходит быстро (не происходит копирование символов). Разумеется, при последующем вызове методов объекта StringBuilder,модифицирующих его содержимое, происходит создание нового массива символов(строки-то неизменяемы).

Из-за того, что у типа StringBuilderпочему-то нет некоторых методов, присущих типу String (ToUpper, Trim и т.д.), при построениистрок иногда приходится использовать временные объекты String,что не слишком удобно. Будем надеяться, что в будущем подобные методы появятсяи в StringBuilder…

Нужно также отметить, что тип StringBuilderне обеспечивает безопасное обращение к своим методам из разных потоков, чтонаверняка обусловлено соображениями производительности. Еще один важный аспектпроизводительности – вычисление приблизительного размера буфера заранее.Задание параметра capacity при создании экземпляра StringBuilder может значительно ускорить работу с ним.

И еще, - не стоит впадать в крайности. Например, я не стал бы использовать тип StringBuilder для того, чтобысложить две строки в конструкторе формы.

Преобразование объекта в строку и строки в объект

У любого объекта (поскольку все типы унаследованы от System.Object) есть виртуальный метод ToString, который возвращает строковое представлениеобъекта. Базовая реализация этого метода просто возвращает название типа объекта. Но у многих типов (особенно элементарных) этот метод перегружен и возвращает более полезную информацию (например, для объекта типа double метод ToString возвращает его значение в виде строки в соответствии с региональными стандартами).

Разумеется, метода ToString безпараметров иногда бывает недостаточно (допустим, когда нужно представить числов шестнадцатеричном виде или в соответствии с конкретными региональнымистандартами). Именно для решения таких задач многие типы реализуют интерфейс IFormattable, предоставляющий метод ToStringс двумя параметрами – форматирующей строкой и объектом, реализующим интерфейс IFormatProvider. Например, для вывода числа 12.34 в денежных единицах Пакистана можно использовать такой код:

12.34f.ToString("C", newSystem.Globalization.CultureInfo("ur-PK"));

 Как другой вариант решения задачи форматирования, можно использовать соответствующие методы типа Convert (которые просто используют метод ToString интерфейса IFormattable, если же переданный объект не реализует этот интерфейс, у него вызывается метод ToString безпараметров). Конечно, сфера применения типа Convert неограничивается форматированием строк – достаточно посмотреть список егометодов. Только с помощью этого типа можно использовать кодирование base64, позволяющее относительно экономно преобразовывать байтовый массив в строку. Вызов метода ToBase64String для массива (0, 100):

Convert.ToBase64String(new byte[] {0, 100});

вернет строку "AGQ=", которую можно преобразоватьобратно в байтовый массив с помощью метода FromBase64String. Приятная особенность кодировки base64 состоит в том, что получившаяся строка не будет содержать «плохих» символов(кавычки, апострофы, перевод каретки и т.п.) что иногда бывает весьма полезно(например, для записи в XML-файл).

Многие типы позволяют получать объект из строки с помощьюметода Parse. Для элементарных числовых типов можнодополнительно задать IFormatProvider и флаги NumberStyles (для типа DateTimeзадаются флаги DateTimeStyles).

Если Вы хотите получить число из его шестнадцатеричной записи, это можно сделать следующим образом:

int.Parse("FF",System.Globalization.NumberStyles.HexNumber);

 Еще у нескольких десятков типов есть метод Parse (например, у System.Net.IPAddress), но не для всех типов он выполняет функцию преобразования строки в объект этого типа (к примеру, HttpChannel.Parse).

По какой-то причине, из всех элементарных числовых типов в .NET 1.1 только у типа System.Double есть метод TryParse,который позволяет получить число из строки без генерации исключения в случае несоответствия формата строки. С другой стороны, с помощью сочетания флагов NumberStyles, можно проверять строки и для целых чисел (но результат преобразования, конечно, все равно будет иметь тип double).

 
« Предыдущая статья   Следующая статья »