ТОР 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.
Большинство методов 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 такого запаса нет, поэтому при каждой попытке добавить новый символ будет создаваться новая строка требуемой длины. Не нашли, что искали? Воспользуйтесь поиском:
|