В идеале, каждый раз код завершения с объектом, который реализует IDisposable
, это будет гарантировать, что Dispose
метод объекта вызывается прежде, чем она отказалась. Иногда, однако, объекты, которые реализуют IDisposable
, могут быть оставлены без надлежащего расположения.
Классы в .NET могут попросить систему наблюдать за экземплярами и сообщить им, если они, похоже, были оставлены. Это делается путем переопределения метода, называемого Finalize
, который является частью типа Object
. Если этот метод переопределен и не был подавлен, и система замечает, что объект будет иметь право на сбор, если не будет присутствовать активный финализатор, система переведет систему в очередь объектов, метод Finalize
должен работать как можно скорее как практические и подавлять дальнейшие наблюдения за объектом (поэтому объект получит один снимок при запуске своего метода Finalize
, но после этого он будет иметь право на сбор).
По какой-то причине я не понимаю, создатели C# решили запретить программистам, использующим этот язык, переопределить метод Finalize
напрямую. Вместо этого требуется, чтобы они использовали специальный синтаксис, который, в свою очередь, инструктировал компилятор переопределить Finalize
. Блок кода, отмеченный ~ClassName
, будет выполняться, когда система замечает, что объект был оставлен, и запускает свой метод Finalize
.
Возможный дубликат [Финализировать/Убирать шаблон в C#] (http://stackoverflow.com/questions/898828/finalize-dispose-pattern-in-c-sharp) – Console