IDisposable интерфейс и реализовать метод деконструкции - PullRequest
0 голосов
/ 15 февраля 2012

Я изучаю теорию C #, и у меня нет ясной части теории. Когда мне приходится вызывать в классе метод деструктора, который я ДОЛЖЕН реализовывать в интерфейсе IDisposable, я имею в виду, что реализация интерфейса строго коррелирует с деструктором?

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

«Деструктор» в C # не «разрушает» объект. Напротив, он предписывает компилятору сгенерировать нечто, называемое «финализатором», существование которого указывает сборщику мусора, что, когда обнаруживается, что объект был оставлен, он должен быть уведомлен об этом факте (запустив код внутри тела. деструктора) до того, как он или любой объект, на который он имеет прямую или косвенную ссылку, уничтожен.

В редких случаях возникает необходимость того, чтобы объект что-то сделал в ответ на то, что его оставили. Если объект запросил один или несколько внешних объектов сделать что-либо от его имени до дальнейшего уведомления (например, он запросил и получил эксклюзивный доступ к файлу), он должен уведомить такие объекты, как только их услуги больше не нужны. Этого лучше всего добиться, если объект реализует IDisposable.Dispose с помощью метода, который упорядочит свои дела, выполняя такие уведомления, и заставляя пользователя такого объекта уведомлять его, когда он больше не нужен, перед тем как отказаться это , позвонив вышеупомянутому IDisposable.Dispose. Финализаторы, как правило, существуют только как задний план в случае, если объекты были ошибочно оставлены без предварительного уведомления о том, что они больше не нужны.

С педагогической точки зрения я бы отложил обучение чему-либо о деструкторах, за исключением того факта, что существуют способы, с помощью которых программы, которые ошибочно отказываются от объектов без предварительного вызова IDisposable.Dispose, могут быть превращены в работу «своего рода сорта». Наличие неправильно написанных деструкторов / финализаторов часто превращает программу, которая явно и с ошибками, потерпела бы неудачу, в программу, которая обычно работает, но иногда дает сбой причудливым и необъяснимым образом. Если подумать, даже правильно написанные деструкторы / финализаторы могут иметь почти такой же эффект, хотя сбои менее часты и менее причудливы. ИМХО, все усилия, предпринимаемые начинающим, учащимся писать финализаторы, лучше потратить на то, чтобы не нуждаться в них.

1 голос
/ 15 февраля 2012

Нет, если вы реализуете 'финализатор' в своем классе C #, вам не нужно также реализовывать интерфейс IDisposable. Однако это считается «наилучшей практикой».

Почему? Что ж, типичная причина реализации финализатора в классе - это восстановление ограниченных ресурсов, «принадлежащих» экземплярам класса. Возможно, класс управляет подключением к базе данных или дескриптором файла или ресурса. Поскольку .NET использует сборку мусора для управления временем жизни объектов, нет никакой гарантии относительно того, когда будет запущен финализатор (есть способы принудительно запустить финализаторы, но у этого есть определенные недостатки).

Интерфейсы IDisposable позволяют потребителям класса более тщательно контролировать использование ресурсов, управляемых этим классом. Когда вы реализуете интерфейс IDisposable, вы можете рассматривать финализатор как отказоустойчивый механизм в случае, если класс не «утилизирован» должным образом.

...