Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 44

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 38 39 40 41 42 43 < 44 > 45 46 47 48 49 50 .. 320 >> Следующая

о внутреннем состоянии объекта (в формате имя — значение)
Пока мы будем считать, что основное назначение этого метода — освободить все ресурсы, занятые объектом данного класса, перед удалением этого объекта. Подробнее о службах сборки мусора в CLR будет рассказано в главе 3
MemberwiseCloneO Этот метод предназначен для создания еще одной ссылки на область, занимаемую объектом данного типа в оперативной памяти. Этот метод не может быть замещен. Если вам потребовалось реализовать поддержку создания полной копии объекта в оперативной памяти, вы должны реализовать в вашем классе поддержку интерфейса ICIoneable (об этом — в главе 4)
Мы продемонстрируем использование методов, которые унаследованы от System.Object, при помощи следующего определения класса:
// Создаем объекты и знаками иен с методами, унаследованными от System.Object using System; class ObjTest 1
public static int Main<stnng[] args) I
Il Создаен экэенпляр ObjTest
ObjTest Cl = new ObjTest<):
Il Выводим информацию на консоль
Console.WnteLineC'ToString: {0}", cl.ToStringO): Corsole.WriteLineCNosh Code: {0)\ с I.GetHashCodeO);
Точка отсчета для любых типов: System.Object 91
Console.WriteLineC"Type: {0}". cl.GetTypeO.ToStn'ngO);
// Создаем еще одну ссылку на -:i ObjTest с2 - cl; object о - с2;
// Действительно ли все три экземпляра указывают на одну // и ту же область в оперативной паняти? 1f(o,Equals(cl) &S c2.Equals(o)l
Console.Wr іteline("Same і nstance!"):
return
}
)
Результаты работы программы представлены на рис. 2.8,
Щ D:\ODturtients and Settings ,ftdminis.-MH Ё
roSti'iny: ObjTest BJ
Hash code: 2 Type: ObjTest
Sane Instance) !
Press Any key to continue ]
Рис. 2.8. Применение некоторых методов, унаследованных от System.Object
Обратите внимание, что реализация по умолчанию метода ToStri ng во;(нращж г только имя того типа, из которого данный метод был вызван (ObjTest). Очень часто этот метод в производных классах замещается таким образом, чтобы возвращать информацию о внутреннем состоянии объекта (мы тоже этим вскоре :<aii-мемся). А пока рассмотрим следующий отрезок кода:
// Сравниваем ссылки на объекты public static int Main(string[] args) {
Il Создаен экземпляр объекта ObjTest ObjTest cl = new ObjTest О:
//Создаем дополнительные ссылки на cl
ObjTest c2 - cl:
object о - cl:
// Действительно ли все три экземпляра указывает на одну и ту же область // в оперативной паняти? if{o.Equals{cl) && c2.Equals(o))
Console,WriteLinet"Same instance!"J;
return 0:
}
Как мы помним, исходный вариант Eo1UtT! ?, () использует для сравнения ссылочную, а не структурную семантику, В начале мы создали новый объект типа ObjTest с \\ш -нем cl. В результате для этого объекта в области управляемой кучи была выделена, оперативная память. Объект с2 также относится к типу Однако при его
нии мы не создавали нового экземпляра объекта. Вместо этого была создана еще одна
92 Глава 2 • Основы языка С#
ссылка ту же область оперативной памяти, которую занимает объект Точно таким же способом была создана и третья ссылка на ту же область памяти — объект о. Поскольку и cl, и с2, и о — это ссылки на одну и ту же область оперативной памяти, операция сравнения с использованием метода [qual s 'J вернула положительный результат.
Замещение методов System.Object
Методы, которые типы данных наследуют от System.Object, во многих ситуациях исключительно полезны. Но обычно при создании своих собственных типов данных некоторые методы System.Object приходится замещать. Рассмотрим такое замещение на примере. Для целей нашего примера мы будем использовать уже знакомый нам класс Person, в который мы добавим переменные для хранения данных об имени человека, его номере социального страхования и возрасте:
// мокните! Все классы в конечно* итоге производятся от класса System.Object
class Person
{
public Person(string fname. string !name, string ssn. byte a) {
firstName - fname: lastname = lname: SSN - ssn; age = a;
}
public Person(){) // Всем іеречекнин-членам будут присвоены значения по умолчанию
// Данные о человеке public string firstName: public string lastNarrie: publicstringSSN: public byte age;
}
В качестве замещаемого метода мы выберем Object.Tc-Stnr,g( 5. Мы хотим, чтобы этот метод возвращал не имя типа, а информацию о внутреннем состоянии ¦объекта. Более подробно замещение методов будет рассмотрено в следующей главе. Сейчас нам достаточно отметить, что мы меняем поведение метода TcStnnq-;) специально для нашего класса Person:
.// Ссылка на это пространство имен необходима для получения доступа к типу StringBuilder using System.Text:
// В нашем классе Person метод ToString будет реализован следующим образом: class Person
I
Il Занещаен метод, унаследованный от System.Object:
public override srting ToStringO
{
StringBuilder sb - new StringBuilderO
sb.AppendC"[FirstName= " + this.firstName): sb.AppendC" LastName- " + this,lastName): sb.Append(" SSN= ' + this.SSN): sb.Append(" Age- " + this.age + "]");
Точка отсчета для любых типов: System.Object 93
Предыдущая << 1 .. 38 39 40 41 42 43 < 44 > 45 46 47 48 49 50 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100