// Неявное получение класса из System.Object.
class.HelloClass {…}
Если вы желаете уточнить свои намерения, операция C#, обозначаемая двоеточием (:), позволяет явно указать базовый класс типа (например. System.Object).
// В обоих случаях класс явно получается из System.Object.
class ShapeInfo: System.Object {…}
class ShapeInfo: object {…}
Тип System.Object определяет набор членов экземпляра и членов класса (статических членов). Заметим, что некоторые из членов экземпляра объявляются с использованием ключевого слова virtual и поэтому могут переопределяться порождаемым классом.
// Класс, занимающий наивысшую позицию в .NET:
// System.Object
namespace System{
public class Object {
public Object();
public virtualBoolean Equals(Object obj);
public virtualInt32 GetHashCode();
public Type GetType();
public virtualString ToString();
protected virtualvoid Finalize();
protected Object MemberwiseClone();
public static bool Equals(object objA, object objB);
public static bool ReferenceEquals(object objA, object objB);
}
}
В табл. 3.10 предлагаются описания функциональных возможностей методов экземпляра для указанного объекта.
Таблица 3.10.Наиболее важные члены System.Object
Метод экземпляра класса Object |
Описание |
Equals() |
По умолчанию возвращает true (истина), когда сравниваемые элементы ссылаются на один и тот же элемент в памяти. Поэтому используется для сравнения объектных ссылок, а не состояний объектов. Обычно переопределяется так, чтобы значение true возвращалось тогда, когда сравниваемые объекты имеют одинаковые значения внутреннего состояния (те, одинаковую семантику значений). При переопределении Equals() следует также переопределить GetHashCode() |
GetHashCode() |
Возвращает целое значение, идентифицирующее объект в памяти. Если вы собираетесь разместить определяемые вами типы в типе System.Collections.Hashtable, рекомендуется переопределить заданную по умолчанию реализацию этого члена |
GetType() |
Возвращает объект System.Туре, полностью описывающий данный элемент. Это RTTI-метод (RunTime Type Identification – идентификация типа в среде выполнения), доступный для всех объектов (соответствующие вопросы обсуждаются в главе 12) |
ToString() |
Возвращает строковое представление данного объекта в формате пространствоИмен.имяТипа (т.е. полное, или абсолютное имя). Если тип определен не в рамках пространства имен, возвращается только имяТипа. Этот метод может переопределяться подклассом и возвращать не абсолютное имя, а строку пар имен и значений, представляющих внутреннее состояние объекта |
Finalize() |
Этот защищенный метод (если он переопределен) вызывается средой выполнения .NET, когда объект удаляется из динамической памяти. Соответствующий процесс сборки мусора рассматривается в главе 5 |
MemberwiseClone() |
Защищенный метод, возвращающий новый объект, который является "почленной" копией данного объекта. Если объект содержит ссылки на другие объекты, то копируются ссылки на соответствующие типы (т.е. выполняется поверхностное копирование). Если объект содержит типы, характеризуемые значениями, получаются полные копии значений |
Поведение System.Object, заданное по умолчанию
Чтобы продемонстрировать некоторые особенности принятого по умолчаниюповедения базового класса System.Object, рассмотрим класс Person (персона), определенный в пользовательском пространстве имен ObjectMethods.
// Ключевое слово 'namespace' обсуждается в конце этой славы.
namespace ObjectMethods {
class Person {
public Person(string fname, string lname, string s, byte a) {
firstName = fname; lastName = lname; SSN = s; age = a;
}
public Person() {}
// Персональные данные (данные состояния).
public string firstMame;
public string lastName;
public string SSN;
public byte age;
}
}
Теперь используем тип Person в рамках метода Main().
static void Main(string[] args) {
Console.WriteLine("***** Работа с классом Object *****\n");
Person fred = new Person("Фред", "Кларк", "111-11-1111", 20);
Console.WriteLine("-› fred.ToString: {0}", fred.ToString());
Console.WriteLine("-› fred.GetHashCode: {0} ", fred.GetHashCode());
Console.WriteLine("-› базовый класс для 'fred': {0}", fred.GetType().BaseType);
// Создание дополнительных ссылок на 'fred'.
Person p2 = fred;
object о = p2;
// Указывали ли все 3 экземпляра на один объект в памяти?
if (о.Equals(fred) && p2.EqualS(o)) Console.WriteLine("fred, p2 и о ссылаются на один объект! " );
Читать дальше