Полное руководство. С# 4.0 - Шилдт Герберт
Для получения неполной копии достаточно вызвать метод MemberwiseClone(),определяемый в классе Object из метода Clone(). В качестве упражнения попробуйтезаменить метод Clone() в предыдущем примере программы на следующий его вариант.// Сделать неполную копию вызывающего объекта.public object Clone() { Test temp = (Test) MemberwiseClone(); return temp;}
После этого изменения результат выполнения данной программы будет выглядетьследующим образом.Значения объекта оb1: о.а: 10, b: 20Сделать объект оb2 копией объекта оb1.Значения объекта оb2: о.а: 10, b: 20Изменить значение оb1.о.а на 99, а значение оb1.b — на 88.Значения объекта оb1: о.а: 99, b: 88Значения объекта оb2: о.а: 99, b: 20
Как видите, обе переменные экземпляра о в объектах оb1 и оb2 ссылаются на одини тот же объект типа X. Поэтому изменения в одном объекте оказывают влияние надругой. Но в то же время поля b типа int в каждом из них разделены, поскольку типызначений недоступны по ссылке.Интерфейсы IFormatProvider и IFormattable
В интерфейсе IFormatProvider определен единственный метод GetFormat(), который возвращает объект, определяющий форматирование данных в удобочитаемойформе текстовой строки. Ниже приведена общая форма метода GetFormat():object GetFormat(Type formatType)
где formatType — это объект, получаемый для форматирования.Интерфейс IFormattable поддерживает форматирование выводимых результатовв удобочитаемой форме. В нем определен следующий метод:string ToString(string format, IFormatProvider formatProvider)
где format обозначает инструкции для форматирования, a formatProvider —поставщик формата.
ПРИМЕЧАНИЕПодробнее о форматировании речь пойдет в главе 22.Интерфейсы IObservable и IObserver
В версию .NET Framework 4.0 добавлены еще два интерфейса, поддерживающиешаблон наблюдателя: IObservable и IObserver. В шаблоне наблюдателяодин класс (в роли наблюдаемого) предоставляет уведомления другому классу (в ролинаблюдателя). С этой целью объект наблюдаемого класса регистрирует объект наблюдающего класса. Для регистрации наблюдателя вызывается метод Subscribe(), который определен в интерфейсе IObservable и которому передается объект типаIObserver, принимающий уведомление. Для получения уведомлений можнозарегистрировать несколько наблюдателей. А для отправки уведомлений всем зарегистрированным наблюдателям применяются три метода, определенные в интерфейсе IObserver. Так, метод OnNext() отправляет данные наблюдателю, методOnError() сообщает об ошибке, а метод OnCompleted() указывает на то, что наблюдаемый объект прекратил отправку уведомлений.
ГЛАВА 22. Строки и форматирование
В этой главе рассматривается класс String, положенный в основу встроенного в C# типа string. Как известно, обработка символьных строк является неотъемлемой частью практически всех программ. Именно поэтой причине в классе String определяется обширныйряд методов, свойств и полей, обеспечивающих наиболееполное управление процессом построения символьныхстрок и манипулирования ими. С обработкой строк тесносвязано форматирование данных в удобочитаемой форме.Используя подсистему форматирования, можно отформатировать данные всех имеющихся в C# числовых типов,а также дату, время и перечисления.Строки в C
Вопросы обработки строк уже обсуждались в главе 7,и поэтому не стоит повторяться. Вместо этого целесообразно дать краткий обзор реализации символьных строк в С#,прежде чем переходить к рассмотрению класса String.
Во всех языках программирования строка представляетсобой последовательность символов, но конкретная ее реализация отличается в разных языках. В некоторых языкахпрограммирования, например в C++, строки представляют собой массивы символов, тогда как в C# они являютсяобъектами встроенного типа данных string. Следовательно, string является ссылочным типом. Более того,string — это имя стандартного для среды .NET строкового типа System.String. Это означает, что в C# строке какобъекту доступны все методы, свойства, поля и операторы,определенные в классе String.
После создания строки последовательность составляющих ее символов не можетбыть изменена. Благодаря этому ограничению строки реализуются в C# более эффективно. И хотя такое ограничение кажется на первый взгляд серьезным препятствием,на самом деле оно таковым не является. Когда требуется получить строку как разновидность уже существующей строки, достаточно создать новую строку, содержащуютребующиеся изменения, и "отвергнуть" исходную строку, если она больше не нужна.А поскольку ненужные строковые объекты автоматически утилизируются средствами"сборки мусора", то беспокоиться о дальнейшей судьбе "отвергнутых" строк не приходится. Следует, однако, подчеркнуть, что переменные ссылок на строки могут, безусловно, изменить объект, на который они ссылаются. Но сама последовательность символов в конкретном строковом объекте не подлежит изменению после его создания.
Для создания строк, которые нельзя изменить, в C# предусмотрен классStringBuilder, находящийся в пространстве имен System.Text. Но на практикедля этой цели чаще используется тип string, а не класс StringBuilder.Класс String
Класс String определен в пространстве имен System. В нем реализуются следующие интерфейсы: IComparable, IComparable, ICloneable, IConvertible,IEnumerable, IEnumerable и IEquatable. Кроме того, String —герметичный класс, а это означает, что он не может наследоваться. В классе Stringпредоставляются все необходимые функциональные возможности для обработки символьных строк в С#. Он служит основанием для встроенного в C# типа string и является составной частью среды .NET Framework. В последующих разделах представленоподробное описание класса String.Конструкторы класса String
В классе String определено несколько конструкторов, позволяющих создаватьстроки самыми разными способами. Для создания строки из символьного массиваслужит один из следующих конструкторов.public String(char[ ] value)public String(char[ ] value, int startIndex, int length)
Первая форма конструктора позволяет создать строку, состоящую из символов массива value. А во второй форме для этой цели из массива value извлекается определенное количество символов (length), начиная с элемента, указываемого по индексуstartIndex.
С помощью приведенного ниже конструктора можно создать строку, состоящую изотдельного символа, повторяющегося столько раз, сколько потребуется:public String(char с, int count)
где с обозначает повторяющийся символ; a count — количество его повторений.
Кроме того, строку можно создать по заданному указателю на символьный массив,используя один из следующих конструкторов.public String(char* value)public String(char* value, int startIndex, int length)
Первая форма конструктора позволяет создать строку из символов, доступныхиз массива по указателю value. При этом предполагается, что массив, доступныйпо указателю value, завершается пустым символом, обозначающим конец строки.А во второй форме конструктора для этой цели из массива, доступного по указателюvalue, извлекается определенное количество символов (length), начиная с элемента,указываемого по индексу startIndex. В этих конструкторах применяются указатели,поэтому их можно использовать только в небезопасном коде.
И наконец, строку можно построить по заданному указателю на байтовый массив,используя один из следующих конструкторов.public String(sbyte* value)public String(sbyte* value, int startIndex, int length)public String(sbyte* value, int startIndex, int length, Encoding enc)
Первая форма конструктора позволяет построить строку из отдельных байтов символов, доступных из массива по указателю value. При этом предполагается, что массив, доступный по указателю value, завершается признаком конца строки. Во второйформе конструктора для этой цели из массива, доступного по указателю value, извлекается определенное количество байтов символов (length), начиная с элемента,указываемого по индексу startIndex. А третья форма конструктора позволяет указать количество кодируемых байтов. Класс Encoding находится в пространстве именSystem.Text. В этих конструкторах применяются указатели, и поэтому их можно использовать только в небезопасном коде.