Главные методы объекта System.Object
Метод | Назначение |
Equals() | По умолчанию этот метод возвращает «истинно» только тогда, когда сравниваемые сущности указывают на одну и ту же область в оперативной памяти. Поэтому этот метод в его исходной реализации предназначен только для сравнения объектов ссылочных типов, но не структурных. Для нормальной работы с объектами структурных типов этот метод необходимо заместить. Однако помните, что если вы замещаете этот метод, вам потребуется также заместить метод GetHashCode() |
GetHashCode() | Возвращает целочисленное значение, идентифицирующее конкретный экземпляр объекта данного типа. |
GetType() | Метод возвращает объект Туре(), полностью описывающий тот объект, из которого метод был вызван. |
ToString() | Возвращает символьное представление объекта в формате <имя_пространства_имен>.<имя_класса> (такой формат носит также название «полностью определенного имени» — fully qualified name). Если тип определен вне какого-либо пространства имен, возвращается только имя класса. Этот метод может быть замещен для представления информации о внутреннем состоянии объекта (в формате имя — значение). |
Finalize() | Пока мы будем считать, что основное назначение этого метода — освободить все ресурсы, занятые объектом данного класса, перед удалением этого объекта. |
MemberwiseClone(); | Этот метод предназначен для создания еще одной ссылки на область, занимаемую объектом данного типа в оперативной памяти. Этот метод не может быть замещен. Если вам потребовалось реализовать поддержку создания полной копии объекта в оперативной памяти, вы должны реализовать а вашем классе поддержку интерфейса ICloneable. |
Листинг 8.9. Демонстрация методов, унаследованных от класса System.Object
using System;
using System.Collections.Generic;
using System.Text;
namespace classSystemObject
{
class ObjTest
{
static void Main(string[] args)
{
ObjTest c1 = new ObjTest();
// Выводим информацию на консоль
Console.WriteLine("ToString: {0}", c1.ToString());
Console.WriteLine("Hash Code: {0}", c1.GetHashCode());
Console.WriteLine("Type: {0}", c1.GetType().ToString());
// Создаем еще одну ссылку на c1
ObjTest c2 =c1;
object o = c2;
// Действительно ли все три экземпляра указывают на одну
// и ту же область в оперативной памяти?
if (o.Equals(c1) && c2.Equals(o))
Console.WriteLine(" Ссылки установлены на одну область памяти!");
}
}
}
o continue
Обратите внимание, что реализация по умолчанию метода ToString возвращает только имя того типа, из которого данный метод был вызван (ObjTest). Очень часто этот метод в производных классах замещается таким образом, чтобы возвращать информацию о внутреннем состоянии объекта.
Замещение методов класса System.Object. Методы, которые наследуют типы данных от класса System.Object, во многих ситуациях исключительно полезны. Но обычно при создании своих собственных типов данных некоторые методы класса System.Object приходится замещать. Рассмотрим такое замещение на примере. Для целей нашего примера мы будем использовать класс Person (Листинг 8.10), в который мы поместим переменные для хранения данных об имени человека, его номере социального страхования и возрасте:
Листинг 8.10. Замещение методов ToString, Equals и GetHashCode класса System.Object в классе Person
using System;
using System.Collections.Generic;
using System.Text;
namespace Person
{
class Person
{
// Данные о человеке
public string FirstName; //Фамилия
public string LastName; //Имя
public string SSN; // номер социального страхования
public byte age; //возраст
// конструктор с параметрами
public Person(string fname, string lname, string ssn, byte a)
{
FirstName = fname;
LastName = lname;
SSN = ssn;
age = a;
}
// замещаем метод Equals(), унаследованный от System.Object метод
// возвращает истинно тогда, когда у сравниваемых объектов типа Person
// внутренние состояния одинаковы (то есть значения полей
// firstName, lastName, SSN и age совпадают)
public override bool Equals(object o)
{
// выполняется сравнение значений переменных объекта, принимаемого в
// качестве параметра, со значениями переменных объекта, для которого
// метод Equals был вызван (c помощью ключевого слова this)
Person temp = (Person) o;
if (temp.FirstName == this.FirstName && temp.LastName ==this.LastName
&& temp.SSN == this.SSN && temp.age == this.age)
{ return true; }
else return false;
}
// замещаем метод ToString(), унаследованный от System.Object так, чтобы
// он возвращал не имя типа, а информацию о внутреннем состоянии объекта // возвращаемое значение типа string заключено в прямоугольные скобки []
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("[FirstName= {0}", this.FirstName);
sb.AppendFormat(" LastName= {0}", this.LastName);
sb.AppendFormat(" SSN= {0}", this.SSN);
sb.AppendFormat(" Age= {0}]", this.age);
return sb.ToString();
}
// замещение метода GetHashCode()
public override int GetHashCode()
{
// Возвращаем хэш-код, основанный на номере социального страхования
// (переменной SSN)
return SSN.GetHashCode();
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("***** Тестирование класса Person*****");
Person p1 = new Person("Иванов", "Иван", "222-22-2222", 25);
Person p2 = new Person("Иванов", "Иван", "222-22-2222", 25);
// используем замещенный метод Equals()для сравнения внутреннего
// состояния (полей) объектов p1 и p2
if (p1.Equals(p2) && p1.GetHashCode() == p2.GetHashCode())
Console.WriteLine("Объекты P1 и P2 одинаковы\n");
else
Console.WriteLine("Объекты P1 и P2 различны\n");
// меняем внутренне состояние объекта p2
p2.age = 2;
// еще раз производим сравнение внутреннего состояния объектов p1 и p2
if (p1.Equals(p2) && p1.GetHashCode() == p2.GetHashCode())
Console.WriteLine("Объекты P1 и P2 равны\n");
else
Console.WriteLine("Объекты P1 и P2 различны\n");
// Get stringified version of objects.
Console.WriteLine(p1.ToString());
Console.WriteLine(p2);
}
}
}
Программа выводит следующие строки:
***** Тестирование класса Person*****
Объекты P1 и P2 одинаковы
Объекты P1 и P2 различны
[FirstName= Иванов LastName= Иван SSN= 222-22-2222 Age= 25]
[FirstName= Иванов LastName= Иван SSN= 222-22-2222 Age= 2]
Примечание. При замещении метода EqualsO следует также заместить метод GetHashCode (). В случае, если это сделано не будет, компилятор выдаст предупреждение. Метод GetHashCode() возвращает числовое значение, идентифицирующее объект в оперативной памяти. Чаще всего это значение используется в коллекциях, работающих с хэш-кодами объектов.
- Лабораторная работа 6 Тема: Наследование классов
- Базовые и производные классы
- Доступ к наследуемым элементам
- 8.1.2. Конструкторы классов и наследование
- 8.2. Виртуальные методы. Динамическое связывание
- 8.3. Абстрактные классы
- 8.4. Класс System.Object
- Главные методы объекта System.Object
- Контрольные вопросы и задания
- Варианты заданий