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

 

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

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

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

Ссылочные типы
Где размещаются
ЭТИ ТИПЫ?
Как будет представлена переменная, которой в качестве значения присвоен этот тип?
Что может являться для них базовым типом?
Может ли этот тип выступать в качестве базового?
Как производится
передача параметров?
Существует ли возможность переопределить Object. FinalizeO?
Можно ли определить
конструкторы
для этого типа?
Когда происходит «смерть» переменной
данного типа?
В области стека
В виде локальной копии типа
Эти типы могут производиться только напрямую от типа System.ValueType
Нет, Структурные типы всегда
закрыты и дополнение их
другими свойствами
не предусмотрено. Поэтому
они не могут выступать
при наследовании в качестве
базового для других типов
Как значений (то есть вызывающей функции передаются только локальные копии значений переменных)
Нет. Структурные типы никогда
не размещаются в куче
и поэтому к ним не применяется
функция завершения
Да, но конструктор по умолчанию
зарезервирован (то есть
все ваши конструкторы должны
принимать параметры)
Когда происходит выход за область видимости
В области управляемой кучи В виде указателя на область
оперативной памяти,
относящейся к объекту этого типа
Могут производиться от любого
другого типа (за исключением System.ValueType), если этот тип не является
Да, если этот ссылочный тип не определен внутренне как
закрытый
J
Как ссылок (то есть
вызывающей функции
передается ссылка на адрес
данного объекта в оперативной памяти)
Да, но не напрямую
(подробнее
об этом — в главе 3) Конечно!
Во время процесса сборки мусора (garbage collection)
в управляемой куче
Несмотря на все различия, и структурные, и ссылочные типы могут реа-лизовывать стандартные (то есть встроенные) и пользовательские (создаваемые вами) интерфейсы и могут поддерживать любое количество полей, методов, свойств и событий. Чтобы еще раз наглядно продемонстрировать различия между структурными и ссылочными типами, можно рассмотреть следующий код:
// Структурный тип struct PERSON {
public string Name; public int Age;
}:
// Ссылочный тип class Person
Точка отсчета для любых типов: System.Object 89
f
public string Name: public int Age;
}:
class ValRefClass {
public static void MainO {
Il Создаем ссылку на объект в управляемой куче
Person fred = new Person«):
// Создаем значение в стеке PERSON тагу = new PERSONO;
// Создаем еще один Объект в стеке - точную копию первого объекта PERSON jane = тагу;
// А здесь происходит создание всего лишь еще одной ссылки // на уже существующий объект в оперативной памяти Person fredRef - fred:
}
]
Код приложения ValAncJRef можно найти в подкаталоге Chapter 2.
Точка отсчета для любых типов: System.Object
В С# все типы данных (как структурные, так и ссылочные) производятся от единого общего предка: класса System.Object. Класс System.Object определяет общее полиморфическое поведение для всех типов данных во вселенной .NHT (можете считать, что System.Object — эта некоторая разновидность типа Variant в ,NET). Во всех предыдущих примерах у нас не было необходимости явно указывать класс System.Object в качестве базового — это подразумевается само собой. Однако нам ничто не мешает сделать это, явне указав, что наш класс производится от System.Object:
// Еще один вариант: написать "class HelloClass ; object" class HelloClass : System.Object
{.--}
Как и в любом другом классе С#, в классе System.Object существует свой набор членов. Обратите внимание, что некоторые члены определены как виртуальные и должны быть замещены в определении производного класса:
// Самый класс в иерархии классов НЕТ: System .Object
namespace System і
public class Object {
public Objecto;
public virtual Boolean Equals (Object obj); public virtual lnt32 GetHashCodeO: public Type GetTypeO: public virtual String ToStringO:
-
90 Глава 2 • Основы языка С#
protected virtual void Finalize(); protected Object MemberwiseCloneO;
Предназначение каждого из методов описано в табл. 2.3. Таблица 2.3. Главные методы объекта System.Object
Метод
Назначение
EqualsQ
GetHashCodeO GetTypeO
ToStringO FinalizeQ
іПо умолчанию этот метод возвращает «истинно» только тогда, когда сравниваемые сущности указывают на одну и туже область в оперативной памяти. Поэтому этот метод в его исходной реализации предназначен только для сравнения объектов ссылочных типов, но не структурных. Для нормальной работы с объектами структурных типов этот метод необходимо заместить. Однако помните, что если вы замещаете этот метод, вам потребуется также заместить метод GetHashCodeO
Возвращает целочисленное значение, идентифицирующее конкретный экземпляр объекта данного типа
Метод возвращает объект Туре{), полностью опишвгшщй тот объект, из которого метод был вызван. Это метод идентификации времени выполнения (Runtime Type Identification, RTTI), который предусмотрен во всех объектах (подробнее об этом — в главе 7}
Возвращает символьное представление объекта в формате
<имя_пространства_имен>.<имя_класса> (такой формат носит также название «полностью определенного имени» — fully qualified name). Если тип определен вне какого-либо пространства имен, возвращается только имя класса. Этот метод может быть замещен для представления информации
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100