Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДПО_ИИИС / Лекция 5.docx
Скачиваний:
67
Добавлен:
19.05.2015
Размер:
366.51 Кб
Скачать

Базовый тип System.Object

Все типы в C#, как структурные, так и ссылочные, являются производными от одного общего предка - класса System.Object. Это подразумевается по умолчанию и нет необходимости явно указывать этот базовый класс при объявлении производного типа. Хотя ничего не мешает указать его явно. Ниже приведены варианты фрагмента кода, в которых объявления соответствующих типов идентичны

class Hello // Предок System.Object подразумевается по умолчанию

{

....................

}

struct HELLO // Предок System.Object подразумевается по умолчанию

{

....................

}

Листинг 20.14 . Объявления типов без явного указания предка System.Object

class Hello : System.Object

{

....................

}

struct HELLO : System.Object

{

....................

}

Листинг 20.15 . Объявления типов c явным указанием предка System.Object

using System;

namespace Test

{

class Hello : Object // Укороченно, т.к. пространство имен определено

{

....................

}

struct HELLO : object // С маленькой буквы, потому что предусмотрен синоним

{

....................

}

}

Листинг 20.16 . Объявления типов c явным укороченным указанием предка System.Object

Ниже приведен код объявления библиотечного класса System.Object

namespace System

{

public class Object

{

public Object();

public virtual Boolean Equals(Object obj);

public virtual Int32 GetHashCode();

public Type GetType();

public virtual String ToString();

protected virtual void Finalize();

protected Object MemberwiseClone();

}

}

Листинг 20.17 . Объявление библиотечного класса System.Object

Предназначение каждого метода приведено в таблице

Таблица 20.4 . Главные методы базового библиотечного класса System.Object

Метод

Описание

Equals()

Возвращает true, если сравниваемые сущности занимают одну и ту же область памяти. По умолчанию настроен для сравнивания объектов ссылочных типов. Для применения к объектам структурных типов этот метод и сопутствующий ему метод GetHashCode() нужно перегрузить своими методами.

GetHashCode()

Возвращает целочисленное значение ID, идентифицирующее конкретный экземпляр объекта данного типа. Генерирует уникальный хэш.

GetType()

Метод возвращает объект Type(), полностью описывающий тот объект, из которого этот метод был вызван. Это метод идентификации времени выполнения ( Runtime Type Identification - RTTI ) , который предусмотрен во всех объектах.

ToString()

Возвращает символьное представление объекта в формате "путь_пространства_имен.имя_класса". Такой формат называется fully qualified name - полностью определенное имя. Если тип определен вне какого-либо пространства имен, возвращается только имя класса без именного пути. Этот метод может быть перегружен для предоставления информации о внутреннем состоянии объекта в формате имя-значение.

Finalize()

Основное назначение этого метода - освободить все ресурсы, занятые объектом данного класса, перед его удалением для корректной работы сборщика мусора gc - Garbare Collector.

MemberwiseClone()

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

В следующем примере продемонстрированы возможности некотороых из перечисленных методов

using System;

namespace Test

{

//*******************************************************

class ObjTest

{

}

//*******************************************************

class App

{

static void Main()

{

// Создаем объект на куче

ObjTest obj1 = new ObjTest();

// Выводим информацию, возвращенную методами

// базового класса System.Object

Console.WriteLine("ToString(): {0}",

obj1.ToString());

Console.WriteLine("GetHashCode(): {0}",

obj1.GetHashCode());

Console.WriteLine("GetType(): {0}",

obj1.GetType().ToString());

// Создаем еще две ссылки на объект obj1

ObjTest obj2 = obj1;

object obj3 = obj2;

// Проверяем, действительно ли все три ссылки

// указывают на одну и ту же область оперативной памяти

if(obj1.Equals(obj2) && obj2.Equals(obj3))

Console.WriteLine("Адресация памяти совпадает");

while(true);

}

}

}

Листинг 20.18 . Демонстрация возможностей методов класса System.Object

Результаты экрана

ToString(): Test.ObjTest

GetHashCode(): 2

GetType(): Test.ObjTest

Адресация памяти совпадает

Соседние файлы в папке ИДПО_ИИИС