Класс System.Object в C#

Каждый объект в CLR наследуется от System.Object — базового типа для всех других типов. В С# ключевое слово obj ect представляет собой псевдоним System.Object.То, что каждый тип в CLR и С# наследуется от Object, может оказаться удобным.

Например, коллекцию экземпляров разных типов можно трактовать как однородную, приведя их все к ссылкам на Object.

Даже System.ValueType наследуется от Object. Однако получение ссылки на Object регулируется некоторыми специальными правилами. На ссылочных типах можно преобразовывать ссылку на класс А в ссылку на класс Object простым неявным преобразованием.

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

Прямое получение ссылки Object для типа значения формально невозможно. Семантически это оправдано, поскольку типы значений расположены в стеке. Было бы опасно получить ссылку на кратковременно существующий экземпляр значения и сохранить ее для последующего использования, когда этот экземпляр значения уже, вероятно, исчезнет. По этой причине получение ссылки на Object для типов значений сопряжено с операцией упаковки.

Определение класса System.Object выглядит так:

1
2
3
4
5
6
7
8
9
10
11
public class Object {
public Object ();
public virtual void Finalize();
public virtual bool Equals ( object obj );
public static bool Equals ( object objl, object obj2 );
public virtual int GetHashCode ();
public Type GetType ();
protected object MemberwiseClone ();
public static bool ReferenceEquals ( object objl, object obj2 );
public virtual string ToString();
}

Object предоставляет ряд методов, которые проектировщики CLI/CLR сочли важными и подходящими для каждого объекта. Методы, имеющие дело с эквивалентностью, требуют отдельного рассмотрения; они будут описаны в следующем разделе. В Object предусмотрен метод GetType для получения типа времени выполнения любого объекта, работающего в CLR.

Возможность определения типов в системе во время выполнения в сочетании с рефлексией чрезвычайно удобна. GetType возвращает объект типа Туре, который представляет реальный, или конкретный, тип объекта.

Используя этот возвращенный объект, можно узнать все о типе объекта, с которым был вызван метод GetType. К тому же, имея две ссылки на тип Object, можно сравнивать результат вызова GetType для них обоих, чтобы узнать, являются ли они экземплярами одного и того же типа.

System.Object содержит метод по имени MemberwiseClone, возвращающий неглубокую копию объекта.

Когда метод MemberwiseClone создает копию, все поля типов значений копируются бит за битом, в то время как все поля ссылочного типа просто копируются, так что и оригинал, и копия содержат ссылки на один и тот же объект. Когда вы хотите получить копию объекта, такое поведение не обязательно устроит.

Поэтому если объекты поддерживают копирование, можно подумать о поддержке ICloneable и предпринять необходимые действия в реализации интерфейса. Обратите также внимание, что метод MemberwiseClone объявлен как protected. Главная причина состоит в том, что только класс копируемого объекта может вызвать его, поскольку MemberwiseClone может создать объект без вызова его конструктора экземпляра.

Такое поведение потенциально могло бы стать дестабилизирующим, если сделать метод общедоступным (public).

Четыре из методов Object являются виртуальными, и если их реализация в Object по умолчанию не подходит, ее можно переопределить. Метод ToString удобен для генерации текстового, читабельного для человека вывода и строкового представления объекта. Например, во время разработки может понадобиться возможность трассировки объекта в отладочном выводе во время выполнения.

В таких случаях имеет смысл переопределить ToString, чтобы он предоставлял детальную информацию об объекте и его внутреннем состоянии. Версия ToString по умолчанию просто вызывает реализацию ToString объекта Туре, возвращенного GetType, а результате возвращая только имя типа объекта.

Это лучше, чем ничего, но, скорее всего, окажется недостаточно полезным, если необходимо вызывать ToString на объекте.

Постарайтесь избежать добавления сторонних эффектов в реализацию ToString, поскольку отладчик Visual Studio может вызывать ее для отображения информации во время отладки. Фактически ToString — наиболее полезный метод при отладке и мало применимый где-либо еще.

Метод Finalize имеет специальное назначение. В С# его явное переопределение не разрешено. Также нельзя его вызывать на объекте. Если необходимо переопределить этот метод в классе, можно воспользоваться синтаксисом деструктора С#.

Эквивалентность и ее смысл

Эквивалентность между ссылочными типами, унаследованными от System.Object — непростой вопрос. По умолчанию семантика эквивалентности, предоставленная Object.Equals, подразумевает семантику идентичности. Это значит, что проверка эквивалентности вернет true, если две ссылки указывают на один и тот же экземпляр объекта.

Однако семантику Object.Equals можно изменить для определения эквивалентности значений. Это значит, что две ссылки на два совершенно разных экземпляра объектов могут при сравнении давать true, если внутреннее состояние двух экземпляров совпадает.

Интерфейс IComparable

System.IComparable — определенный в системе интерфейс, который объекты могут реализовывать, если они поддерживают упорядочивание. Его потребуется реализовать, если объектам имеет смысл поддерживать упорядочивание в классах коллекций, предоставляющих возможности сортировки. Например, хоть это может показаться очевидным, но System.Int32, имеющий в С# псевдоним int, реализует IComparable.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100