
- •Создание консольного проекта про c#
- •Выполнение проекта по умолчанию после "большого взрыва"
- •Проект WindowsHello
- •Структура класса c#
- •Создание объектов и их инициализация
- •Вынесение класса с точкой входа в отдельный файл
- •Инициализация членов без конструктора
- •Типы данных в c#
- •Общие сравнения структурных и ссылочных типов
- •Базовый тип System.Object
- •Перегрузка стандартных методов класса System.Object
- •Перегрузка (замещение) виртуального метода ToString()
- •Статические методы класса System.Object
- •Системные типы данных и их псевдонимы как встроенные типы c#
Базовый тип 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
Адресация памяти совпадает