Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык C# и основы платформы .NET.docx
Скачиваний:
57
Добавлен:
11.05.2015
Размер:
203.66 Кб
Скачать

14. КлассSystem.Objectи иерархия типов

Диаграмма, показанная на рис. 3, связывает типы платформы .NET с точки зрения отношения наследования.

Рис. 3. Иерархия типов платформы .NET

Все типы в .NET Framework наследуются (прямо или косвенно) от класса System.Object1(в C# для этого типа используется псевдонимobject). ТипSystem.ValueTypeявляется предком всех типов значений (включая числовые типы, пользовательские структуры и перечисления). Массивы наследуются от классаSystem.Array, а классSystem.Delegateявляется предком всех делегатов.

Рассмотрим элементы класса System.Object(в алфавитном порядке).

publicvirtualboolEquals(objectobj)

Данный метод определяет, равен ли объект objтекущему объекту. РеализацияEquals()по умолчанию обеспечивает равенство ссылок для ссылочных типов и побитовое равенство для типов значений. Пользовательский тип может переопределять методEquals(). При этом должны выполняться такие правила:

1. x.Equals(x) == true.

2. x.Equals(y) == y.Equals(x).

3. (x.Equals(y) & y.Equals(z)) == true x.Equals(z) == true.

4. Вызовы метода x.Equals(y)возвращают одинаковое значение до тех пор, пока объектыxиyостаются неизменными.

5. x.Equals(null) == false, если x != null.

6. Метод Equals()не должен генерировать исключений.

Типы, переопределяющие метод Equals(), должны также переопределять методGetHashCode()(и наоборот); в противном случае коллекции-словари могут работать неправильно. Если применяется перегрузка операции равенства для заданного типа, то этот тип также должен переопределять и методEquals(). РеализацияEquals()должна возвращать те же результаты, что и перегруженная операция равенства.

publicstaticboolEquals(objecta,objectb)

Метод определяет, равны ли экземпляры aиb. Если оба аргумента равныnull, метод возвращаетtrue. Если только один аргумент равенnull, возвращаетсяfalse. Если оба аргумента не равныnull, возвращаетсяa.Equals(b).

protected virtual void Finalize()

Метод Finalize()позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как объект будет утилизирован в процессе сборки мусора.

public virtual int GetHashCode()

Метод GetHashCode()играет роль хеш-функции для определённого типа. Этот метод можно использовать в алгоритмах хеширования и таких структурах данных, как хеш-таблицы. Реализация методаGetHashCode()по умолчанию не гарантирует уникальность возвращаемых кодов. Пользовательские типы могут переопределять данный метод для эффективного вычисления хеш-функции. Если два объекта при сравнении оказались равны, методыGetHashCode()этих объектов должны возвращать одинаковые значения. Однако если при сравнении оказалось, что объекты не равны, методыGetHashCode()не обязательно должны возвращать разные значения.

public Type GetType()

Данный метод возвращает объект System.Typeдля текущего экземпляра. ОбъектSystem.Typeсодержит метаданные, связанные с классом текущего экземпляра.

protected object MemberwiseClone()

Метод MemberwiseClone()применяется для создания неполной копии объекта. Метод создаёт новый объект (конструктор при этом не вызывается), а затем копирует в него нестатические поля текущего объекта. Если поле относится к типу значения, выполняется побитовое копирование полей. Если поле относится к ссылочному типу, копируются ссылки, а не объекты, на которые они указывают. Следовательно, ссылки в исходном объекте и его клоне указывают на один и тот же объект.

publicstaticboolReferenceEquals(objecta,objectb)

Этот статический метод возвращает значение true, если параметрaсоответствует тому же экземпляру, что и параметрb, или же оба они равныnull; в противном случае метод возвращаетfalse.

public virtual string ToString()

Метод ToString()возвращает строку, которой представлен текущий объект. Метод может быть переопределён в производном классе для возврата адекватных значений для данного типа.

Так как System.Objectявляется предком любого типа, переменной типаobjectможно присвоить любую переменную. Если для ссылочных типов при этом происходит только присваивание указателей, для типов значений выполняется специальная операция, называемаяоперацией упаковки(boxing)1. При упаковке в динамической памяти создаётся объект, содержащий значение переменной и информацию о её типе. Упакованный объект можно подвергнуть обратному преобразованию –операции распаковки(unboxing).

int i = 123;

object o = i; // операция упаковки

int j = (int)o; // операция распаковки

По форме операция распаковка выглядит как приведение типов, однако таковой не является. Следующий код при выполнении генерирует исключение:

object o = 123; // операция упаковки литерала int

shortj = (short)o;// генерируется InvalidCastException

При распаковке необходимо указывать точный тип упакованного объекта:

short j = (short)(int)o; // распаковка, затем приведение типов