Предпочтительным способом является реализация IDisposable
вместе с шаблоном удаления. Финализаторы ограничены по времени, и GC завершит финализатор, если он блокируется слишком долго — это основная причина, по которой его следует избегать, где это возможно.
Dispose
— это просто вызов метода и не ограничен по времени. Шаблон dispose дополнительно содержит финализатор для тех ситуаций, когда вызывающий объект забыл вызвать Dispose
(поскольку он не применяется принудительно) в качестве последней попытки высвободить ресурсы. Шаблон также подавляет финализатор, если была вызвана функция dispose.
Единственное правильное использование, с которым я столкнулся, нуждающееся в финализаторе, было для серии надстроек, которые я написал для стороннего приложения, которое не вызывало соответствующие события для правильного управления временем жизни объекта. Я использовал финализатор, чтобы убедиться, что я хотя бы попытался очистить материал. Кроме этого, я никогда не полагался на него напрямую.
IDisposable
соответствует ключевому слову using
в C#. Все, что реализует этот интерфейс, можно использовать таким образом:
using (var myDisposableItem = new MyDisposableItem())
{
} // Dispose will be called here for you.
Итак, с точки зрения вызова это очень просто.
В .NET Framework есть различные типы, которые реализуют IDisposable
, но не имеют ничего для удаления. Я всегда советую действовать так, как будто им нужно избавляться напрямую, потому что в публичном контракте указано, что у них есть что утилизировать, даже если в реализации этого нет. Не программируйте детали реализации.
person
Adam Houldsworth
schedule
03.10.2013