Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Строковый тип StringBuilder




Для динамических операций со строками и символами в библиотеке классов.NET Framework существует тип System.TextStringBuilder пространства имен System.Text. У объекта StringBuilder предусмотрено поле с ссылкой на массив структур Char. Используя члены StringBuilder, можно эффективно манипулировать этим массивом, изменяя строку и ее символы. При увеличении строки, представляющей массив символов, StringBuilder автоматически выделяет память для нового, большего по размеру массива, копирует в него символы и работает уже с новым массивом. Прежний массив в дальнейшем утилизируется сборщиком мусора. При работе со строками рекомендуется создавать методы, у которых в качестве параметров выступают объекты String, а не StringBuilder. Сформировав строку с помощью объекта StringBuilder, рекомендуется на ее основе создать объект String, вызвав метод ToString типа StringBuilder. Этот метод возвращает ссылку на поле-строку, управляемую объектом StringBuilder. Массив символов при этом не копируется, поэтому метод выполняется быстро. Объект String, возвращаемый методом ToString, не может быть изменен. Поэтому, если вызвать метод, который попытается изменить строковое поле, управляемое объектом StringBuilder, методы этого объекта, зная, что для него был вызван ToString, создадут новый массив символов, манипуляции с которым не повлияют на строку, возвращенную предыдущим вызовом ToString.

Объект StringBuilder создается так же, как любой объект неэлементарного типа:

StringBuilder sb = new StringBuilder();

У типа StringBuilder несколько конструкторов. Каждый из них обязан выделять память и инициализировать три внутренних поля, управляемых любым объектом StringBuilder.

· Максимальная емкость (Maximum capacity) – поле типа int, задающее максимальное число символов, размещаемых в строке. По умолчанию оно равно Int32MaxValue (около 2 млрд). Это значение обычно не изменяется, хотя можно задать и меньшее значение, ограничивающее размер создаваемой строки. Для существующего объекта StringBuilder это поле изменить нельзя.

· Емкость (Capacity) – поле типа int, показывающее размер массива символов StringBuilder. По умолчанию оно равно 16. Если известно, сколько символов предполагается разместить в StringBuilder, следует указать это число при создании объекта StringBuilder.

· Массив символов (Character array) – массив структур char, содержащий набор символов строки. Число символов всегда меньше (или равно) емкости и максимальной емкости. Количество символов в строке можно получить через свойство Length типа StringBuilder. Length всегда меньше или равно емкости StringBuilder. При создании StringBuilder можно инициализировать массив символов, передавая ему String как параметр. Если строка не задана, массив первоначально не содержит символов и свойство Length возвращает 0.

Тип StringBuilder в отличие от string представляет изменяемую строку. Это значит, что многие члены StringBuilder изменяют содержимое в массиве символов, не создавая новых объектов, размещаемых в управляемой куче. StringBuilder выделяет память для новых объектов только:

· при динамическом увеличении размера строки, превышающего установленную емкость;

· при попытке изменить массив, после того как был вызван метод ToString типа StringBuilder.

В следующей таблице представлены некоторые методы и свойства класса StringBuilder.

Член Описание
MaxCapacity (свойство) Возвращает наибольшее количество символов.
Capacity (свойство) Получает/устанавливает размер массива символов. При попытке установить емкость меньшую, чем длина строки, или большее, чем MaxCapacity, генерируется исключение ArgumentOutOfRangeException.
EnsureCapacity (метод) Гарантирует, что размер массива символов будет не меньше, чем значение параметра, передаваемого этому методу. Если значение превышает текущую емкость объекта StringBuilder, размер массива увеличивается. Если текущая емкость больше, чем значение, передаваемое этому свойству, размер массива не изменяется.
Length (свойство) Возвращает количество символов в строке. Эта величина может быть меньше текущей емкости массива символов. Присвоение этому свойству значения 0 сбрасывает содержимое и очищает строку StringBuilder.
ToString (метод) Версия без параметров возвращает объект String, представляющий поле с массивом символов объекта StringBuilder (новый объект String не создается). Любая попытка модифицировать массив StringBuilder приведет к выделению памяти под новый массив (заполняемый значениями из старого массива). Метод ToString с параметрами startlndex и length создает новый объект String, в котором представлена указанная параметрами часть StringBuilder.
this[int index] (индексатор) Возвращает из массива или устанавливает в массиве символ с заданным индексом.
AppendFormat (метод) Добавляет заданные объекты в массив символов, увеличивая его при необходимости. Объекты преобразуются в строку указанного формата и с учетом заданных региональных стандартов. Это один из наиболее часто используемых методов при работе с объектами StringBuilder.
Replace (метод) Заменяет один символ или строку символов в массиве символов.
Remove (метод) Удаляет диапазон символов из массива символов.
Equals (метод) Возвращает true, только если объекты StringBuilder имеют одну и ту же максимальную емкость, емкость и одинаковые символы в массиве.
СоруТо (метод) Копирует подмножество символов StringBuilder в массив Char.

Большинство методов StringBuilder возвращает ссылку на тот же объект StringBuilder. Это позволяет выстроить в цепочку сразу несколько операций.

StringBuilder sb = new StringBuilder();

sb.AppendFormat("{0} {1}", ".NET", "---Framework");

string s = sb.Replace("-", " ").Remove(4, 3).ToString();//.NET Framework

У класса StringBuilder нет некоторых аналогов для методов класса String. Например, у класса String есть методы ToLower, ToUpper, EndsWiths, PadLeft, Trim, отсутствующие у класса StringBuilder. В то же время у класса StringBuilder есть удобный метод Replace, выполняющий замену символов и строк лишь в части строки (а не во всей строке). Из-за отсутствия полной аналогии методов следует прибегать иногда к преобразованиям между String и StringBuilder. Так, сформировать строку, сделать все буквы прописными, а затем вставить в нее другую строку позволяет следующий код.

StringBuilder sb = new StringBuilder();

sb.AppendFormat("{0}{1}", ".NET", "Framework");

string s = sb.ToString().ToUpper();

sb.Length = 0;

sb.Append(s).Insert(4, " ");

s = sb.ToString();

Console.WriteLine(s);//.NET FRAMEWORK

Основное отличие классов String и StringBuilder заключается в том, что при создании строки типа string выделяется ровно столько памяти, сколько необходимо для хранения инициализирующего значения. Если создается строка как объект класса StringBuilder, то выделение памяти происходит с некоторым запасом. По умолчанию, под каждую строку выделяется объем памяти, равный минимальной степени двойки, необходимой для хранения инициализирующего значения, хотя можно задать эту величину по своему усмотрению. Например, для инициализирующего значения «это текст» под строку типа string будет выделена память для 9-и символов, а под строку типа StringBuilder – для 16 символов, из которых 9 будут использованы непосредственно для хранения данных, а 7 составят запас, который можно будет использовать в случае необходимости. При добавлении в строку типа StringBuilder еще одного символа, новая строка создаваться не будет. Вместо этого будет изменен уже существующий символ, находящийся в конце используемой части строки. Аналогичные действия будут выполнены при удалении или изменении строки. Если объем добавлений превысит объем созданного запаса, произойдет создание новой строки, длина которой будет в два раза больше, чем длина предыдущей; в нее будет скопировано содержимое старой строки, и добавление продолжится. У строки типа String такого запаса нет, поэтому при каждой попытке добавить новый символ будет создаваться новая строка требуемой длины.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных