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

 

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

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

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 76 77 78 79 80 81 < 82 > 83 84 85 86 87 88 .. 320 >> Следующая

объектами, высвобождается. Завершение ссылки на объект
Та схема управления которая была рассмотрена обладает одной
важной особенностью, которая имеет как положительные, так и отрицательные стороны: она работает полностью автоматически. С одной стороны, это упрощает процесс программирования. С другой — нас может не устраивать то, что процесс удаления объектов (закрытия соединения с базой данных, окна Windows и т. п.) будет происходить в соответствии с неизвестным нам алгоритмом. Например, если тип устанавливает в процессе выполнения соединение с удаленным компьютером, скорее всего, мы захотим, чтобы это соединение разрывалось в соответствии с установленными нами правилами.
Если вам нужно обеспечить возможность удаления объектов из оперативной
памяти в соответствии с определенными вами правилами, первое, о чем вам необходимо позаботиться — о реализации в вашем классе метода System. Object. Fi 1ze(). Заметим между прочим, что реализация этого метода по умолчанию (в базовом классе) ничего не дает. Однако, как это ни странно, в С# запрещено напрямую замещать метод Object. Fi па 11 ze С). Более того, вы даже не сможете вызвать в вашем приложении этот метод напрямую! Если вы хотите, чтобы ваш пользовательский класс поддерживал метод вы должны использовать в определении это-
го класса метод, очень похожий на деструктор C++:
Завершение ссылки на объект 189
// Что-то очень знакомое public class Саг : Object I
// Деструктор
-Саго
[
II Закрывайте все открытые объектом ресурсы!
// Далее в С# будет автоматически вызван метод Base.FinalizeO
}
Г
Если у вас есть опыт работы с ^ то подобный синтаксис вам покажется
знакомым. В С++деструктор класса - это специальный метод класса, имя которого выглядит как имя класса, перед которым стоит символ тильды (-). В C++ гарантируется, что этот метод будет вызван, когда ссылка на объект выходит за пределы области видимости (для типов, размещенных в стеке) или к объект], применяется оператор delete (для объектов, размещенных в области динамической памяти).
При размещении объекта С# в управляемой куче при помощи оператора new среда выполнения автоматически определяет, поддерживает ли на in объект метод FinalizeO (представленный в С# с помощью «деструктороподобного» синтаксиса). Если этот метод поддерживается объектом, ссылка на этот объект помечается как «завершаемая» (finalizable).IIpH этом в специальной внутренней очереди «завершения» (fmalization queue) помещается указатель на данный объект. Когда сборщик мусора приходит к выводу, что наступило время удалять данный объект из оперативной памяти, он обращается к этомууказателю и запускаетдеструктор С#, определенный для этого класса, прежде чем будет произведено физическое удаление объекта из памяти.
Завершение в подробностях
Предположим, мы определили несколько классов автомобилей ni van, SportsCar, Jeep и наш класс Саг). Предположим, что классы Minivan и SportsCar не поддерживают деструкторе*, а классы Jeep и Саг -поддерживают. Поскольку классы Jeep и Саг тем самым замещают метод Object. Fi паї і ze() (косвенно), очередь завершения будет содержать указатели на любой активный объект этих классов. То, что при этом происходит, схематически можно представить так, как показано на рис. 3.22.
Как можно догадаться, удаление из памяти классов, для которых определены деструкторы С#, занимает больше времени, чем удаление классов, для которых деструкторы не определены. В нашем примере для объектов с 1 и с4 деструкторы не определены, и поэтому, когда сборщик мусора сочтет это необходимым, они будут просто немедленно удалены из памяти. При удалении с2 и сЗ (объектов с деструкторами) будут производиться дополнительные вызовы, определенные нами в со-ответствующихдеструкторах. Однако если нам нужно убедиться, что при удалении объекта будут гарантированно освобождаться все занятые им ресурсы и освобождаться они будут в установленном нами порядке, использования пользовательского деструктора С# не избежать.
190 Глава 3 • С# и объектно-ориентированное программирование Управляемая куча
с1 с2 сЗ 04
Активные ссылки
на объекты в приложении
с1 =
Jeep = new Jeep (); Car сЗ = new Car
SportsCar c4 = new SportsCar
c-3
Очередь завершения
Рис. 3.22. Для объектов, поддерживающих деструктор С#,. в очереди завериения создаются специальные указатели
Создание метода удаления для конкретного случая
Еще раз предположим, что объекты в нашем приложении используют определенные ресурсы. Конечно, все эти ресурсы освобождаются при помощи встроенных или пользовательских деструкторов (о которых было рассказано в предыдущем разделе). Однако существуют некоторые особо ценные ресурсы, например подключения к базам данных (за каждое подключение приходится платить), которые хотелось бы освобождать немедленно, а не в соответствии с расписанием работы сборщика мусора. Поэтому проблему можно сформулировать так: каким образом можно освободить ресурс, занятый объектом класса, немедленно, не дожидаясь естественной смерти этого объекта?
Наиболее очевидный способ — использовать для этого специальный метод. В С# метод, принудительно освобождающий интересующие пользователя ресурсы объекта, принято называть Dispose О (освободить). Этот метод пользователь объекта будет вызывать вручную, сразу же по завершении использования этого
Предыдущая << 1 .. 76 77 78 79 80 81 < 82 > 83 84 85 86 87 88 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100