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

 

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

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

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

объекта и задолго до того, как объект выйдет за пределы области видимости и будет помечен как подлежащий физическому удалению из памяти (завершению). Таким образом, можно гарантировать освобождение ресурсов без помещения указателя на деструктор в очередь завершения. Кроме того, в этом случае освобождение ресурсов будет произведено немедленно, а не тогда, когда у сборщика мусора «дойдут руки» до нашего объекта:
//Снабжаем класс методом удаления дя» конкретного случая public Car
Взаимодействие со сборщиком мусора 19 t
// Специальный метод, который пользователь объекта должен вызвать вручную
public void Disposed {
Il ... Закрываем открытые внутренние ресурсы
}
}
Интерфейс !Disposable
Чтобы обеспечить единообразие методов, освобождающих ресурсы в разных классах, библиотеки классов .NET определяют интерфейс !Disposable, который содержит единственный член - метод DisposeC):
public interface !Disposable !
public void DisposeO;
}
С концепцией интерфейсов мы познакомимся в следующей главе. Сейчас достаточно будет отметить, что рекомендуется реализовывать этот интерфейс для всех классов, которые должны поддерживать явную форму освобождения ресурсов. Например, применить этот интерфейс в случае класса Саг можно следующим образом:
// Реализуем IDisposable
public Саг : !Disposable
{
// Это - единственный нетод, который пользователь объекта должен вызвать // вручную
public void DisposeO
{
// ...Закрываем открытые внутренние ресурсы
1
>
Используя этот подход, мы предоставляем пользователю возможность любой момент высвобождать наиболее ценные ресурсы, не загружая дополнительно очередь завершения. Кроме того, мы вполне можем сочетать применение интерфейса
!Disposable (с методом DisposeO) и пользовательского деструктора С#.
Взаимодействие со сборщиком мусора
Как и все в мире .NET, сборщик мусора — это объект, и мы можем обращаться к нему через ссылку на объект. Для работы со сборщиком мусора в С# предназначен специальный класс - System. GC (от garbage collector - сборщик мусора). Этот класс определен как sealed, то есть производить от него другие классы при помощи наследования невозможно. В System. GC определен небольшой набор статических членов, при помощи которых и осуществляется взаимодействие со сборщиком мусора. Самые важные из этих членов представлены в табл. 3.2.
Мы проиллюстрируем взаимодействие со сборщиком мусора .NET на примере нашего любимого класса Саг:
192 Глава 3 • С# и объектно-ориентированное программирование
,// Припер очистки памяти public class Саг : !Disposable
{
-СагО (
// При сборке мусора вызвать наш собственный вариант метода DisposeO Disposed;
J
// Наш зариамт метода DisposeO
public void DisposeO
{
Il Закрываем открытые внутренние ресурсы
'Il Если пользователь вызвал Disposed, необходимость в завершении .// отпадает, поэтому подавляем завершение
iGC,SupressFinal1ze(this) ;
Таблица 3.2. Некоторые члены типа System. GC
Член Назначение
ColJectO Заставляет сборщик заняться выполнением своих обязанностей
для всех поколений (о поколениях — чуть ниже). По желанию можно указать в качестве параметра конкретное поколение
GetGeneradonQ Возвращает поколение, к которому относится данный объект
MaxGeneration Возвращает максимальное количество поддерживаемое
данной системой
ReRegisterForRnaleeQ Устанавливает флаг возможности завершения для объектов, которые ранее были помечены как незавершаемые при помощи метода SupressFI паї ize()
SuppressRnalize() Устанавливает флаг запрещения завершения для объектов, которые
в противном случае могли бы быть завершены сборщиком мусора
Возвращает количество памяти (в байтах), которое в настоящее время занимают объекты в управляемой куче, включая те объекты, которые будут вскоре удалены. Этот метод принимает параметр типа boolean, ¦с помощью которого можно указать, запускать или нет процесс сборки _ мусора при вызове этого метода
Обратите внимание, что этот вариант класса Саг поддерживает как деструктор С#, так и интерфейс !Disposable. Метод DisposeO определен таким образом, что при его выполнении происходит вызов метода GC.SupressFinalize{). Таким образом, мы сообщаем системе, что деструктор для данного объекта вызывать уже не нужно — все ресурсы будут освобождены при помощи метода DisposeO.
Мы покажем возможности сосуществования явного и подразумеваемого удаления объектов на примере программы, представленной ниже. В ней перед самым концом программы происходит вызов метода GC.CollectO, который инициирует срабатывание деструкторов для всех объектов. Однако ранее мы произвели вызов метода DisposeO для двух объектов Саг. В результате для этихобъектов сработал метод GC. SupressFI паї і ze() (смотри определение класса Саг выше), и эти объекты
Взаимодействие со сборщиком мусора 193
были помечены как незавершаемые. Поэтому в процессе работы GC .Col lecU ¦ деструкторы для этих двух объектов вызваны не будут:
// Прикер азвичэяействкя с GC
public class GCApp
{
public static int Main(string[] args) {
Console.WritetineC'Heap memory 1n use: {O}",
Предыдущая << 1 .. 77 78 79 80 81 82 < 83 > 84 85 86 87 88 89 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100