Выбрать главу

Для получения неполной копии достаточно вызвать метод MemberwiseClone (), определяемый в классе Object из метода Clone (). В качестве упражнения попробуйте заменить метод Clone () в предыдущем примере программы на следующий его вариант.

// Сделать неполную копию вызывающего объекта, public object Clone ()    {

Test temp = (Test) MemberwiseClone(); return temp;

}

После этого изменения результат выполнения данной программы будет выглядеть следующим образом.

Значения объекта obi: о.а: 10, Ь: 20 Сделать объект оЬ2 копией объекта оЫ.

Значения объекта оЬ2: о.а: 10, Ь: 20

Изменить значение obi.о.а на 99, а значение obl.b — на 88.

Значения объекта obi: о.а: 99, Ь: 88 Значения объекта оЬ2: о.а: 99, Ь: 20

Как видите, обе переменные экземпляра о в объектах оЫ и оЬ2 ссылаются на один и тот же объект типа X. Поэтому изменения в одном объекте оказывают влияние на другой. Но в то же время поля b типа int в каждом из них разделены, поскольку типы значений недоступны по ссылке.

Интерфейсы I Forma tProvider и I Format table

В интерфейсе I Forma tProvider определен единственный метод Get Format (), который возвращает объект, определяющий форматирование данных в удобочитаемой форме текстовой строки. Ниже приведена общая форма метода Get Format ():

object GetFormat(Type formatType)

где formatType — это объект, получаемый для форматирования.

Интерфейс I Format table поддерживает форматирование выводимых результатов в удобочитаемой форме. В нем определен следующий метод:

string ToString(string format, IFormatProvider formatProvider)

где format обозначает инструкции для форматирования, a formatProvider — поставщик формата.

ПРИМЕЧАНИЕ

Подробнее о форматировании речь пойдет в главе 22.

Интерфейсы IObservable<T> и IObserver<T>

В версию .NET Framework 4.0 добавлены еще два интерфейса, поддерживающие шаблон наблюдателя: IObservable<T> и IObserver<T>. В шаблоне наблюдателя один класс (в роли наблюдаемого) предоставляет уведомления другому классу (в роли наблюдателя). С этой целью объект наблюдаемого класса регистрирует объект наблюдающего класса. Для регистрации наблюдателя вызывается метод Subscribe (), который определен в интерфейсе IObservable<T> и которому передается объект типа IObserver<T>, принимающий уведомление. Для получения уведомлений можно зарегистрировать несколько наблюдателей. А для отправки уведомлений всем зарегистрированным наблюдателям применяются три метода, определенные в интерфейсе IObserver<T>. Так, метод OnNext () отправляет данные наблюдателю, метод OnError () сообщает об ошибке, а метод OnCompleted () указывает на то, что наблюдаемый объект прекратил отправку уведомлений.

ГЛАВА 22 Строки и форматирование

В этой главе рассматривается класс String, положенный в основу встроенного в C# типа string. Как известно, обработка символьных строк является неотъемлемой частью практически всех программ. Именно по этой причине в классе String определяется обширный ряд методов, свойств и полей, обеспечивающих наиболее полное управление процессом построения символьных строк и манипулирования ими. С обработкой строк тесно связано форматирование данных в удобочитаемой форме. Используя подсистему форматирования, можно отформатировать данные всех имеющихся в C# числовых типов, а также дату, время и перечисления.

Строки в с#

Вопросы обработки строк уже обсуждались в главе 7, и поэтому не стоит повторяться. Вместо этого целесообразно дать краткий обзор реализации символьных строк в С#, прежде чем переходить к рассмотрению класса String.

Во всех языках программирования строка представляет собой последовательность символов, но конкретная ее реализация отличается в разных языках. В некоторых языках программирования, например в C++, строки представляют собой массивы символов, тогда как в C# они являются объектами встроенного типа данных string. Следовательно, string является ссылочным типом. Более того, string — это имя стандартного для среды .NET строкового типа System. String. Это означает, что в C# строке как объекту доступны все методы, свойства, поля и операторы, определенные в классе String.