Строки в C#
Основные концепции Для представления строкой информации в.NET существует класс System.String. У него есть псевдоним string, для которого в C# реализована встроенная поддержка. Строки задаются в двойных кавычках. Строка может содержать управляющие последовательности, которые начинаются с обратной наклонной черты. Есть возможность создавать дословные (verbatim) строки, где каждый символ воспринимается как есть. Такие строки начинаются string s3 Как и все в С# строка – это объект. И следовательно у объекта есть свойства и методы. Следует отметить, что строка является неизменяемым объектом (immutable), то есть любые методы работы со строками возвращают обработанные копии, а оригинал остается неизменным. Индексация строки идет от 0.
Объявление строк. Конструкторы класса string Объекты класса String объявляются как все прочие объекты простых типов - с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса. Чаще всего, при объявлении строковой переменной конструктор явно не вызывается, а инициализация задается строковой константой. Но у класса String достаточно много конструкторов. Они позволяют сконструировать строку из: символа, повторенного заданное число раз; массива символов char[] ; части массива символов.
Операции над строками Над строками определены следующие операции: присваивание ( = ); две операции проверки эквивалентности ( == ) и ( != ); конкатенация или сцепление строк ( + ); взятие индекса ( [] ).
Строковые константы Без констант не обойтись. В C# существуют два вида строковых констант: обычные константы, которые представляют строку символов, заключенную в заданные обычной константой c предшествующим
Неизменяемый класс string В языке C# существует понятие неизменяемый (immutable) класс. Для такого класса невозможно изменить значение объекта при вызове его методов. Динамические методы могут создавать новый объект, но не могут изменить значение существующего объекта. К таким неизменяемым классам относится и класс String. Ни один из методов этого класса не меняет значения существующих объектов. Конечно, некоторые из методов создают новые значения и возвращают в качестве результата новые строки. Невозможность изменять значения строк касается не только методов. Аналогично, при работе со строкой как с массивом разрешено только чтение отдельных символов, но не их замена. Оператор присваивания в котором делается попытка изменить первый символ строки, недопустим, а потому закомментирован. //Неизменяемые значения s1= "Zenon"; ch1 = s1[0]; //s1[0]='L';
Статические свойства и методы класса String Метод Описание Empty Возвращается пустая строка. Свойство со статусом read only Compare Сравнение двух строк. Метод перегружен. Реализации метода позволяют сравнивать как строки, так и подстроки. При этом можно учитывать или не учитывать регистр, особенности национального форматирования дат, чисел и т.д. CompareOrdinal Сравнение двух строк. Метод перегружен. Реализации метода позволяют сравнивать как строки, так и подстроки. Сравниваются коды символов Concat Конкатенация строк. Метод перегружен, допускает сцепление произвольного числа строк Copy Создается копия строки Format Выполняет форматирование в соответствии с заданными спецификациями формата. Intern, IsIntern Отыскивается и возвращается ссылка на строку, если таковая уже хранится во внутреннем пуле данных. Если же строки нет, то первый из методов добавляет строку во внутренний пул, второй - возвращает null. Методы применяются обычно тогда, когда строка создается с использованием построителя строк - класса StringBuilder Join Конкатенация массива строк в единую строку. При конкатенации между элементами массива вставляются разделители. Операция, заданная методом Join, является обратной к операции, заданной методом Split. Последний является динамическим методом и, используя разделители, осуществляет разделение строки на элементы
Метод Format Метод Format определяет формат вывода строки на экран. Как и большинство методов, является перегруженным и может вызываться с разным числом параметров. Первый необязательный параметр метода задает провайдера, определяющего национальные особенности, которые используются в процессе форматирования. В качестве такого параметра должен быть задан объект, реализующий интерфейс System.IFormatProvider. Если этот параметр не задан, то используется культура, заданная по умолчанию. Вот примеры двух реализаций этого метода: public static string Format(string, object);public static string Format(IFormatProvider, string, params object[]); Параметр типа string задает форматируемую строку. Заданная строка содержит один или несколько форматов, они распознаются за счет окружающих формат фигурных скобок. Число форматов, вставленных в строку, определяет и число объектов, передаваемых при вызове метода Format. Каждый формат определяет форматирование объекта, на который он ссылается и который, после преобразования его в строку, будет подставлен в результирующую строку вместо формата. Метод Format в качестве результата возвращает переданную ему строку, где все спецификации формата заменены строками, полученными в результате форматирования объектов.
Общий синтаксис, специфицирующий формат, таков: {N [,M [: ]]} Обязательный параметр N задает индекс объекта, заменяющего формат. Можно считать, что методу всегда передается массив объектов, даже если фактически передан один объект. Индексация объектов начинается с нуля, как это принято в массивах. Второй параметр M, если он задан, определяет минимальную ширину поля, которое отводится строке, вставляемой вместо формата. Третий необязательный параметр задает коды форматирования, указывающие, как следует форматировать объект. Например, код C ( Currency ) говорит о том, что параметр должен форматироваться как валюта с учетом национальных особенностей представления. Код P ( Percent ) задает форматирование в виде процентов с точностью до сотой доли.
Методы Join и Split Динамический метод Split позволяет осуществить разбор текста на элементы. public string[] Split(params char[]) На вход методу Split передается один или несколько символов, интерпретируемых как разделители. Объект string, вызвавший метод, разделяется на подстроки, ограниченные этими разделителями. Из этих подстрок создается массив, возвращаемый в качестве результата метода. Статический метод Join выполняет обратную операцию, собирая строку из элементов. public static string Join(string delimiters, string[] items ) В качестве результата метод возвращает строку, полученную конкатенацией элементов массива items, между которыми вставляется строка разделителей delimiters. Как правило, строка delimiters состоит из одного символа, который и разделяет в результирующей строке элементы массива items ; но в отдельных случаях ограничителем может быть строка из нескольких символов.
Пример. Необходимо разбить строку – сложноподчиненное предложение на простые предложения. после чего разделить предложения на слова, а затем собрать текст обратно.
Обратите внимание, что методы Split и Join хорошо работают, когда при разборе используется только один разделитель. В этом случае сборка действительно является обратной операцией и позволяет восстановить исходную строку. Если же при разборе задается некоторое множество разделителей, то возникают две проблемы: невозможно при сборке восстановить строку в прежнем виде, поскольку не сохраняется информация о том, какой из разделителей был использован при разборе строки. Поэтому при сборке между элементами вставляется один разделитель, возможно, состоящий из нескольких символов; при разборе двух подряд идущих разделителей предполагается, что между ними находится пустое слово. Обратите внимание в тексте нашего примера, как и положено, после запятой следует пробел. При разборе текста на слова в качестве разделителей указаны символы пробела и запятой. По этой причине в массиве слов, полученном в результате разбора, имеются пустые слова.
Динамические методы класса String Метод Описание Insert Вставляет подстроку в заданную позицию Remove Удаляет подстроку в заданной позиции Replace Заменяет подстроку в заданной позиции на новую подстроку Substring Выделяет подстроку в заданной позиции IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny Определяются индексы первого и последнего вхождения заданной подстроки или любого символа из заданного набора StartsWith, EndsWith Возвращается true или false, в зависимости от того, начинается или заканчивается строка заданной подстрокой PadLeft, PadRight Выполняет набивку нужным числом пробелов в начале и в конце строки Trim, TrimStart, TrimEnd Обратные операции к методам Pad. Удаляются пробелы в начале и в конце строки, или только с одного ее конца ToCharArray Преобразование строки в массив символов
Класс StringBuilder - построитель строк Класс string не разрешает изменять существующие объекты. Строковый класс StringBuilder позволяет компенсировать этот недостаток. Этот класс принадлежит к изменяемым классам и его можно найти в пространстве имен System.Text. Объявление строк. Конструкторы класса StringBuilder Объекты этого класса объявляются с явным вызовом конструктора класса. Поскольку специальных констант этого типа не существует, то вызов конструктора для инициализации объекта просто необходим. Конструктор класса перегружен, и наряду с конструктором без параметров, создающим пустую строку, имеется набор конструкторов, которым можно передать две группы параметров. Первая группа позволяет задать строку или подстроку, значением которой будет инициализироваться создаваемый объект класса StringBuilder. Вторая группа параметров позволяет задать емкость объекта - объем памяти, отводимой данному экземпляру класса StringBuilder. Каждая из этих групп не является обязательной и может быть опущена. Примером может служить конструктор без параметров, который создает объект, инициализированный пустой строкой, и с некоторой емкостью, заданной по умолчанию, значение которой зависит от реализации. Приведу в качестве примера синтаксис трех конструкторов: public StringBuilder (string str, int cap). Параметр str задает строку инициализации, cap - емкость объекта ; public StringBuilder (int curcap, int maxcap). Параметры curcap и maxcap задают начальную и максимальную емкость объекта ; public StringBuilder (string str, int start, int len, int cap). Параметры str, start, len задают строку инициализации, cap - емкость объекта.
Операции над строками Над строками этого класса определены практически те же операции с той же семантикой, что и над строками класса String: присваивание ( = ); две операции проверки эквивалентности ( == ) и ( != ); взятие индекса ( [] ). Операция конкатенации ( + ) не определена над строками класса StringBuilder, ее роль играет метод Append, дописывающий новую строку в хвост уже существующей. Со строкой этого класса можно работать как с массивом, но, в отличие от класса String, здесь уже все делается как надо: допускается не только чтение отдельного символа, но и его изменение.
Основные методы public StringBuilder Append ( ). К строке, вызвавшей метод, присоединяется строка, полученная из объекта, который передан методу в качестве параметра. Метод перегружен и может принимать на входе объекты всех простых типов, начиная от char и bool до string и long. Поскольку объекты всех этих типов имеют метод ToString, всегда есть возможность преобразовать объект в строку, которая и присоединяется к исходной строке. В качестве результата возвращается ссылка на объект, вызвавший метод. Поскольку возвращаемую ссылку ничему присваивать не нужно, то правильнее считать, что метод изменяет значение строки; public StringBuilder Insert (int location, ). Метод вставляет строку, полученную из объекта, в позицию, указанную параметром location. Метод Append является частным случаем метода Insert ; public StringBuilder Remove (int start, int len). Метод удаляет подстроку длины len, начинающуюся с позиции start ; public StringBuilder Replace (string str1,string str2). Все вхождения подстроки str1 заменяются на строку str2 ; public StringBuilder AppendFormat (, ). Метод является комбинацией метода Format класса String и метода Append. Строка форматов, переданная методу, содержит только спецификации форматов. В соответствии с этими спецификациями находятся и форматируются объекты. Полученные в результате форматирования строки присоединяются в конец исходной строки.