Г. Шилдт - С#4.0 Полное руководство (1160795), страница 155
Текст из файла (страница 155)
раас оЬ)есг С1опе() ( Теяг Сещо = (Те*С) Мещбегнгяес1опе 0; гесигп гетр' ) После этого изменения результат выполнения данной программы будет выглядеть следующим образом. Значения объекта оЫ: о.а: 10, Ь: 20 Сделать объект оЬ2 копией объекта оЫ . Значения объекта оЬ2: о.а: 10, Ь: 20 Изменить значение оЫ .о.а на 99, а значение оЫ .Ь вЂ” на 88. Значения объекта оЫ: о.а: 99, Ъ: 88 Значения объекта оЬ2: о.а: 99, Ь: 20 Как видите, обе переменные экземпляра о в объектах оЬ1 и оЬ2 ссылаются на один и тот же объект типа х. Поэтому изменения в одном объекте оказывают влияние на другой.
Но в то же время поля Ь типа Тпг в каждом из них разделены, поскольку типы значений недоступны по ссылке. Интерфейсы Хй.огша~Ргоч16ег и ХУоппа11аЬХе В интерфейсе 1Гогтяагргочабег определен единственный метод Сегрогщаг (), который возвращает объект, определяющий форматирование данных в удобочитаемой форме текстовой строки. Ниже приведена общая форма метода Яегрогщаг (): оь)есс оесгогщас(туре Гогиагтуре) где тогюа с туре — это объект, получаемый для форматирования.
интерфейс 1Гогщаг ьаь1е поддерживает форматирование выводимых результатов в удобочитаемой форме. В нем определен следующий метод: Ягггпч ТоБСгдпч(яггьпч Тогюаг, 1Гогщагргоч1бег Еогюасргошбег) где тогща г обозначает инструкции для форматирования, а тогща гргочус(ег— поставщик формата. ПРИМЕЧАНИЕ Подробнее о форматировании речь пойдет в главе 22. Интерфейсы 10ЪзегчаЬХе<Т> и ХОЬзегчег<Т> В версию .)Х)ЕТ Егатпеи ог)с 4.0 добавлены еще два интерфейса, поддерживающие шаблон наблюдателя: 10ЬяегчаЬ1е<Т> и 10Ьяегчег<Т>.
В шаблоне наблюдателя один класс (в роли наблюдаемого) предоставляет уведомления другому классу (в роли 782 Часть И. Библиотека С№ наблюдателя). С этой целью объект наблюдаемого класса регистрирует объект наблюдающего класса. Для регистрации наблюдателя вызывается метод ЯпЬзсг1Ье (), который определен в интерфейсе 1оьвегчаь1е<т> и которому передается объект типа 10Ьзегчег<Т>, принимающий уведомление. Для поЛучения уведомлений можно зарегистрировать несколько наблюдателей.
А для отправки уведомлений всем зарегистрированным наблюдателям применяются три метода, определенные в интерфейсе 10ъвегчег<т>. Так, метод Опнекс () отправляет данные наблюдателю, метод ОпЕгсог () сообщает об ошибке, а метод ОпОоыр1екег(() указывает на то, что наблюдаемый объект прекратил отправку уведомлений. 784 Часть П. Библиотека С() После создания строки последовательность составляющих ее символов не мо>хет быть изменена. Благодаря этому ограничению строки реализуются в С)) более эффективно. И хотя такое ограничение кажется на первый взгляд серьезным препятствием, на самом деле оно таковым не является.
Когда требуется получить строку как разновидность уже существующей строки, достаточно создать новую строку, содержащую требующиеся изменения, и "отвергнуть" исходную строку, если она больше не нужна. А поскольку ненужные строковые объекты автоматически утилизируются средствами "сборки мусора", то беспокоиться о дальнейшей судьбе "отвергнутых" строк не приходится. Следует, однако, подчеркнуть, что переменные ссылок на строки могут, безусловно, изменить объект, на который они ссылаются. Но сама последовательность символов в конкретном строковом объекте не подлежит изменению после его создания.
Для создания строк, которые нельзя изменить, в С)) предусмотрен класс БсгапдВп11с[ег, находящийся в пространстве имен Бузсе(п. Техс. Но на практике для этой цели чаще используется тип Ясгапд, а не класс БсгьпдВп11бег. Класс В~гзлщ Класс Бсг1пд определен в пространстве имен Бузге)п. В нем реализуются следующие интерфейсы: 1соирагабте, 1соглрагаЫе<яггапд>, 1с1опеаые, 1сопчегг1ые, 1Еппп)егаЬ1е, 1Еппв)егаЬ1е<сЬаг> и 1ЕдпасаЬ1е<зсг1пд>.
Кроме того, Ясг1пд— герметичный класс, а это означает, что он не может наследоваться. В классе Бсггпд предоставляются все необходимые функциональные возможности для обработки символьных строк в С)). Он служит основанием для встроенного в С() типа Ясг1пд и является составной частью среды .[МЕТ атташе)чог)г. В последующих разделах представлено подробное описание класса Бсг1пд. Конструкторы класса 8Сезлт(т В классе Бсгапд определено несколько конструкторов, позволяющих создавать строки самыми разными способами.
Для создания строки из символьного массива служит один из следующих конструкторов. рагс Ясггпд(сваг[ ) га1ие) риЬзьс 5сггпд (сьаг [ ) ка1се, гпс зсагс1пг(ех, ьпг 1епдсы Первая форма конструктора позволяет создать строку, состоящук) из символов массива са1 се. А во второй форме для этой цели из массива гга1 ие извлекается определенное количество символов (1епдг))') начиная с элемента, указываемого по индексу ягагг1пг)ех. С помощью приведенного ниже конструктора можно созда~в строку, состоящую из отдельного символа, повторяющегося столько раз, сколько потребуется: рпЫгс Ясг1пд(сьаг с, 1пс ссспс) где с обозначает повторяющийся символ; а соипс — количество его повторений.
Кроме того, строку можно создать по заданному указателю на символьный массив, используя один из следующих конструкторов. рпЫгс Ясгьпд(сьаг* га1ие) рпЫгс Ясггпд(сьаг* га1ие, гпс зсагс1пг(ех, ьпс 1епдсь) Глава 22. Строки к Форматирование 785 Первая форма конструктора позволяет создать строку из символов, доступных из массива по указателю иа1ие. При этом предполагается, что массив, доступный по указателю иа1ие, завершается пустым символом, обозначающим конец строки.
А во второй форме конструктора для этой цели из массива, доступного по указателю иа1ие, извлекается определенное количество символов (1епдг Ь), начиная с элемента, указываемого по индексу ясах сТпг(ех. В этих конструкторах применяются указатели, поэтому их можно использовать только в небезопасном коде. И наконец, строку можно построить по заданному указателю на байтовый массив, используя один из следующих конструкторов. риЫ1с Яяг1пд (яЬуге* иа1ие) риы1с яггглд(яьусе* иа1ие, 1пс ягагггпг(ех, гпс 1елдгь) риЫгс Бсг1пд(яЬусе* иа1ие, гпс ясагстпс(ех, гпс 1епдсл, Епссг(гпд еле) Первая форма конструктора позволяет построить строку из отдельных байтов символов, доступных из массива по указателю иа1ие. При этом предполагается, что массив, доступный по указателю иа1 ие, завершается признаком конца строки.
Во второй форме конструктора для этой цели из массива, доступного по указателю иа1не, извлекается определенное количество байтов символов (1 ел де Ь), начиная с элемента, указываемого по индексу я Саг Сгпг(ех. А третья форма конструктора позволяет указать количество кодируемых байтов. Класс Епсог(1пд находится в пространстве имен Буз Сепг.
Техт. В этих конструкторах применяются указатели, и поэтому их можно использовать только в небезопасном коде. При объявлении строкового литерала автоматически создается строковый объект. Поэтому для инициализации строкового объекта зачастую оказывается достаточно присвоить ему строковый литерал, как показано ниже. ягг1пд ягг = "новая строка"; Поле, индексатор и свойство класса 8~гхпд В классе Бгг1пд определено единственное поле. риЫьс ясас1с геас(сп1у ясггпд Барсу Поле Егпрсу обозначает пустую строку, т.е, такую строку, которая не содержит символы. Этим оно отличается от пустой ссылки типа Бег 1 ось которая просто делается на несуществующий объект. Помимо этого, в классе Бсгьпд определен единственный индексатор, доступный только для чтения.
риЫ1с спаг гшя(гпг 1лсех) ( дегг ) Этот индексатор позволяет получить символ по указанному индексу. Индексация строк, как и массивов, начинается с нуля. Объекты типа БС г1пд отличаются постоянством и не изменяются, поэтому вполне логично, что в классе Б Сгъод поддерживается индексатор, доступный только для чтения. И наконец, в классе Бсгзпд определено единственное свойство, доступное только для чтения. риЬТьс 1пс Ъепдсп ( дес," ) Свойство Ьепдсп возвращает количество символов в строке. 786 Часть )).
Библиотека С№ Операторы класса ЯШпд В классе вгг1пд перегружаются два следующих оператора: == и ! =. Оператор == служит для проверки двух символьных строк на равенспю. Когда оператор == применяется к ссылкам на объекты, он обычно проверяет, делаются ли обе ссылки на один и тот же объект. А когда оператор == применяется к ссылкам на объекты типа Б сьота, то на предмет равенства сравнивается содержимое самих строк. Это же относится и к оператору ! =. Когда он применяется к ссылкам на объекты типа Бг гз ад, то на предмет неравенства сравнивается содержимое самих строк. В то же время другие операторы отношения, в том числе < и >=, сравнивают ссылки на объекты типа Бггдпд таким же образом, как и на объекты других типов.
А для того чтобы проверить, является ли одна строка больше другой, следует вызвать метод Соглраге (), определенный в классе ясгзпгь Как станет ясно дальше, во многих видах сравнения символьных строк используются сведения о культурной среде. Но это не относится к операторам = = и! =. Ведь они просто сравнивают порядковые значения символов в строках. (Инымн словами, они сравнивают двоичные значения символов, не видоизмененные нормами культурной среды, т.е.
региональными стандартами.) Следовательно, эти операторы выполняют сравнение строк без учета регистра и настроек культурной среды. Сравнение строк Вероятно, из всех операций обработки символьных строк чаще всего выполняется сравнение одной строки с другой. Прежде чем рассматривать какие-либо методы сравнения строк, следует подчеркнуть следующее: сравнение строк может быть выгюлнено в среде ЛЕТ Ргашеи ог)г двумя основными способами.