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