Справочник по C# Герберт Шилдт ббк 32. 973. 26018 75 Ш57 удк 681 07 Издательский дом "Вильямс" Зав редакцией
Скачать 5.05 Mb.
|
Глава 20 Строки и форматирование 542 Часть II. Библиотека C# та глава посвящена классу string . Как известно каждому программисту, без обработки строк не обходится практически ни одна программа. Поэтому в классе string определено множество методов, свойств и полей, которые предлагают программисту богатую палитру инструментов, позволяющих создавать строки и манипулировать ими. С темой обработки строк тесно связана тема форматирования данных с целью приведения их к форме, удобной для восприятия человеком. Используя возможности соответствующей подсистемы, можно нужным образом форматировать числовые типы языка C#, дату и время, а также перечисления. Строки в C# Обзор средств обработки строк в C# был представлен в главе 7, и повторения “пройденного” здесь не предполагается. Но прежде чем перейти к рассмотрению класса string , имеет смысл поговорить об особенностях реализации строк в языке C#. Во всех языках программирования строка (string) представляет собой последовательность символов, но точная реализация такой последовательности меняется при переходе от одного языка к другому. В языке C++ строки реализованы в виде массивов символов, но в C# все обстоит иначе. Строки в C# — это объекты встроенного типа данных string . Поэтому string является ссылочным типом данных. Более того, string — это C#-имя стандартного строкового типа .NET-среды System.String . Таким образом, C#- строка имеет доступ ко всем методам, свойствам, полям и операторам, определенным в классе String В созданной строке последовательность составляющих ее символов изменить нельзя. Благодаря этому ограничению строки в C# (по сравнению с другими языками) реализованы более эффективно. И хотя это ограничение может показаться серьезным недостатком, на самом деле оно таковым не является. Если вам понадобится строка, которая представляет собой вариацию “на тему” другой, уже существующей строки, просто создайте новую строку, которая будет содержать желаемые изменения, а затем удалите исходный вариант, если он вам больше не нужен. Поскольку неиспользуемые строковые объекты автоматически удаляются подсистемой сбора мусора, можно не беспокоиться об исключенных “из обращения” строках. Однако вы должны четко понимать, что ссылочные переменные типа string , конечно же, могут менять объекты, на которые они ссылаются. А вот последовательность символов конкретного string -объекта после его создания изменить уже нельзя. Чтобы создать строку, которую можно изменять, в C# предусмотрен класс StringBuilder , определенный в пространстве имен System.Text . И все же в большинстве случаев лучше использовать тип string , а не класс StringBuilder Класс String Класс String определен в пространстве имен System . Он реализует интерфейсы IComparable , ICloneable , IConvertible и IEnumerable.String — это sealed -класс, т.е. из него нельзя создать производный класс. Класс String содержит C#- средства обработки строк. Он лежит в основе встроенного C#-типа string и является частью среды .NET Framework. Следующие разделы посвящены детальному рассмотрению класса String Э Глава 20. Строки и форматирование 543 Конструкторы класса String В классе String определено несколько конструкторов, которые позволяют создавать строки различными способами. Чтобы создать строку из символьного массива, используйте один из следующих конструкторов: public String(char[] chrs ) public String(char[] chrs , int start , int count ) Первый формат предназначен для построения строки, которая будет состоять из символов, содержащихся в массиве chrs . Строка, создаваемая с помощью второго формата, будет состоять из count символов, взятых из массива chrs , начиная с символа, индекс которого задан параметром start Существует также возможность создать строку, содержащую заданный символ, повторенный нужное количество раз. Для этого используйте этот конструктор: public String(char ch , int count ) Здесь параметр ch задает символ, который будет повторен count раз. Используя один из следующих конструкторов, можно создать строку, заданную указателем на символьный массив: unsafe public String(char* chrs ) unsafe public String(char* chrs , int start , int count ) Конструктор первого формата предназначен для построения строки, содержащей символы, на которые указывает параметр chrs . При этом предполагается, что параметр chrs указывает на массив с завершающим нулем (символом конца строки). Строка, создаваемая с помощью конструктора второго формата, будет состоять из count символов, взятых из массива, адресуемого указателем chrs , начиная с символа, индекс которого задан параметром start Используя один из следующих конструкторов, можно создать строку, заданную указателем на массив байтов: unsafe public String(sbyte* chrs ) unsafe public String(sbyte* chrs , int start , int count ) unsafe public String(sbyte* chrs , int start , int count , Encoding en ) Конструктор первого формата предназначен для построения строки, содержащей байты, на которые указывает параметр chrs . При этом предполагается, что параметр chrs указывает на массив с завершающим нулем (символом конца строки). Строка, создаваемая с помощью конструктора второго формата, будет состоять из count байтов, взятых из массива, адресуемого указателем chrs , начиная с байта, индекс которого задан параметром start . Третий формат конструктора позволяет указать тип кодирования байтов. По умолчанию используется тип ASCIIEncoding . Класс Encoding определен в пространстве имен System.Text Строковый литерал создает строковый объект автоматически. Поэтому строковый объект часто инициализируется присваиванием ему строкового литерала. Вот пример: string str = "новая строка"; Поле, индексатор и свойство класса String В классе string определено только одно поле: public static readonly string Empty Поле Empty определяет пустую строку, т.е. строку, которая не содержит символов. Не следует путать ее с нулевой (пустой) ссылкой типа String , которая просто ссылается на несуществующий объект. 544 Часть II. Библиотека C# В классе String определен единственный индексатор, предназначенный только для чтения: public char this[int idx ] { get; } Этот индексатор позволяет получить символ по заданному индексу. Подобно массивам, индексация в строках начинается с нуля. Поскольку объекты String не подлежат изменению, в том, что класс String поддерживает индексатор, предназначенный только для чтения, есть здравый смысл. В классе String определено единственное свойство, предназначенное только для чтения: public int Length { get; } Свойство Length возвращает количество символов, содержащихся в строке. Операторы класса String В классе String реализована перегрузка двух операторов: “ == ” и “ != ”. Чтобы узнать, равны ли две строки, используйте оператор “ == ”. Если оператор “ == ” применяется к объектным ссылкам, то он определяет, ссылаются ли они обе на один и тот же объект. Но если оператор “ == ” применяется к двум ссылкам типа String , то сравнивается содержимое самих строк. То же справедливо и для оператора “ != ”: при сравнении String - объектов сравнивается содержимое строк. Но что касается других операторов отношений (например, “ < ” или “ >= ”), то они сравнивают ссылки точно так же, как объекты любых других типов. Чтобы узнать, например, больше (меньше) ли одна строка другой, используйте метод Compare() , определенный в классе String Методы класса String В классе String определено множество различных методов. При этом многие из них имеют два или больше перегруженных форматов. Поэтому вместо бессмысленного их перечисления, рассмотрим лишь наиболее употребимые методы и продемонстрируем их использование на конкретных примерах. Сравнение строк Из всех операций обработки строк, возможно, чаще всего используется операция сравнения одной строки с другой. Поэтому в классе String предусмотрен широкий выбор методов сравнения, которые перечислены в табл. 20.1. Самый универсальный из них — метод Compare() . Он может сравнивать две строки целиком или по частям, причем с учетом (или без) прописного или строчного варианта букв (т.е. регистра клавиатуры). В общем случае при сравнении строк, т.е. при определении того, больше ли одна строка другой, меньше или они равны, используется лексикографический порядок. При этом можно также задать специальную информацию (форматы данных, присущие естественному языку, диалекту или территориальному образованию), которая может повлиять на результат сравнения. Использование нескольких версий метода Compare() демонстрируется в следующей программе: // Сравнение строк. using System; class CompareDemo { public static void Main() { string str1 = "один"; string str2 = "один"; Глава 20. Строки и форматирование 545 string str3 = "ОДИН"; string str4 = "два"; string str5 = "один, два"; if(String.Compare(str1, str2) == 0) Console.WriteLine(str1 + " и " + str2 + " равны."); else Console.WriteLine(str1 + " и " + str2 + " не равны."); if(String.Compare(str1, str3) == 0) Console.WriteLine(str1 + " и " + str3 + " равны."); else Console.WriteLine(str1 + " и " + str3 + " не равны."); if(String.Compare(str1, str3, true) == 0) Console.WriteLine(str1 + " и " + str3 + " равны без учета регистра."); else Console.WriteLine(str1 + " и " + str3 + " не равны без учета регистра."); if(String.Compare(str1, str5) == 0) Console.WriteLine(str1 + " и " + str5 + " равны."); else Console.WriteLine(str1 + " и " + str5 + " не равны."); if(String.Compare(str1, 0, str5, 0, 3) == 0) Console.WriteLine("Первая часть строки " + str1 + " и " + str5 + " равны."); else Console.WriteLine("Первая часть строки " + str1 + " и " + str5 + " не равны."); int result = String.Compare(str1, str4); if(result < 0) Console.WriteLine(str1 + " меньше " + str4); else if(result > 0) Console.WriteLine(str1 + " больше " + str4); else Console.WriteLine(str1 + " равно " + str4); } } Результаты выполнения этой программы таковы: один и один равны. один и ОДИН не равны. один и ОДИН равны без учета регистра. один и один, два не равны. Первая часть строки один и один, два равны. один больше два 546 Часть II. Библиотека C# Таблица 20.1. Методы сравнения, определенные в классе String Метод Описание public static int Compare( string str1 , string str2 ) Сравнивает строку, адресуемую параметром str1 , со строкой, адресуемой параметром str2 . Возвращает положительное число, если строга str1 больше str2 , отрицательное число, если str1 меньше str2 , и нуль, если строки str1 и str2 равны public static int Compare( string str1 , string str2 , bool ignoreCase ) Сравнивает строку, адресуемую параметром str1 , со строкой, адресуемой параметром str2 . Возвращает положительное число, если строка str1 больше str2 , отрицательное число, если str1 меньше str2 , и нуль, если строки str1 и str2 равны. Если параметр ignoreCase равен значению true , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются public static int Compare( string str1 , string str2 , bool ignoreCase , CultureInfo ci ) Сравнивает строку, адресуемую параметром str1 , со строкой, адресуемой параметром str2 , с использованием специальной информации (связанной с конкретным естественным языком, диалектом или территориальным образованием), переданной в параметре ci . Возвращает положительное число, если строка str1 больше str2 , отрицательное число, если str1 меньше str2 , и нуль, если строки str1 и str2 равны. Если параметр ignoreCase равен значению true , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс CultureInfo определен в пространстве имен System.Globalization public static int Compare( string str1 , int start1 , string str2 , int start2 , int count ) Сравнивает части строк, заданных параметрами str1 и str2 Сравнение начинается со строковых элементов str1[start1] и str2[start2] и включает count символов. Метод возвращает положительное число, если часть строки str1 больше части строки str2 , отрицательное число, если str1 - часть меньше str2 -части, и нуль, если сравниваемые части строк str1 и str2 равны public static int Compare( string str1 , int start1 , string str2 , int start2 , int count , bool ignoreCase ) Сравнивает части строк, заданных параметрами str1 и str2 Сравнение начинается со строковых элементов str1[start1] и str2[start2] и включает count символов. Метод возвращает положительное число, если часть строки str1 больше части строки str2 , отрицательное число, если str1 -часть меньше srtr2 -части, и нуль, если сравниваемые части строк str1 и str2 равны. Если параметр ignoreCase равен значению true , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются public static int Compare( string str1 , int start1 , string stx2 , int start2 , int count , bool ignoreCase , CultureInfo ci ) Сравнивает части строк, заданных параметрами str1 и str2 , с использованием специальной информации (связанной с конкретным естественным языком, диалектом или территориальным образованием), переданной в параметре ci Сравнение начинается со строковых элементов str1[start1] и str2[start2] и включает count символов. Метод возвращает положительное число, если часть строки str1 больше части строки str2 , отрицательное число, если str1 -часть меньше str2 -части, и нуль, если сравниваемые части строк str1 и str2 равны. Если параметр ignoreCase равен значению true , при сравнении не учитываются различия между прописным и строчным вариантами букв. В противном случае эти различия учитываются. Класс CultureInfo определен в пространстве имен System.Globalization Глава 20. Строки и форматирование 547 Окончание табл. 20.1 Метод Описание public static int CompareOrdinal( string str1 , string str2 ) Сравнивает строку, адресуемую параметром str1 , со строкой, адресуемой параметром str2 , независимо от языка, диалекта или территориального образования. Возвращает положительное число, если строка str1 больше str2 , отрицательное число, если str1 меньше str2 , и нуль, если строки str1 и str2 равны public static int CompareOrdinal( string str1 , int start1 , string str2 , int start2 , int count ) Сравнивает части строк, заданных параметрами str1 и str2 , независимо от языка, диалекта или территориального образования. Сравнение начинается со строковых элементов str1[start1] и str2[start2] и включает count символов. Метод возвращает положительное число, если часть строки str1 больше части строки str2 , отрицательное число, если str1 -часть меньше str2 -части, и нуль, если сравниваемые части строк str1 и str2 равны public int CompareTo( object str ) Сравнивает вызывающую строку со строкой, заданной параметром str . Возвращает положительное число, если вызывающая строка больше строки str , отрицательное число, если вызывающая строка меньше строки str , и нуль, если сравниваемые строки равны public int CompareTo( string str ) Сравнивает вызывающую строку со строкой, заданной параметром str . Возвращает положительное число, если вызывающая строка больше строки str , отрицательное число, если вызывающая строка меньше строки str , и нуль, если сравниваемые строки равны |