Winforms Утилизация IDisposable
-
03-07-2019 - |
Вопрос
Есть ли у кого-нибудь хорошие статьи или руководства по правильному использованию dispose и IDisposable. Я пытаюсь объяснить это некоторым младшим разработчикам и хотел получить дополнительный материал, примеры и т. Д.
Решение
Хорошее место для начала - статья MSDN Шона Фаркаса http: // msdn.microsoft.com/en-us/magazine/cc163392.aspx . Полная статья написана Джо Даффи на http://www.bluebytesoftware.com /blog/2005/04/08/DGUpdateDisposeFinalizationAndResourceManagement.aspx с некоторыми последующими действиями в http://www.bluebytesoftware.com/blog/2008/02/18/IDisposableFinalizationAndConcurrency.aspx р>
Другие советы
Многие старые источники рекомендаций на этот счет подразумевают, что IDisposable каким-то образом связан с финализаторами. Обратите очень пристальное внимание на комментарии Херба Саттера на эту тему. НЕ спешите с выводом, что вам нужно написать финализатор, если вы реализуете IDisposable, чтобы «убедиться, что Dispose запускается в конце концов, в случае, если клиент забудет вызвать его». Это вообще не тот случай. Класс может реализовывать IDisposable, чтобы он мог выполнять различные вызовы управляемых объектов, которыми он владеет, например, Утилизируйте эти объекты по очереди. Это абсолютно бессмысленно делать с финализатором, потому что финализаторы не могут надежно обращаться к другим управляемым объектам. Кроме того, все, что делает финализатор, должно вызываться из любого потока. Финализаторы - очень непонятная вещь, в то время как IDisposable - это простой шаблон, который должен быть вездесущим. А появление SafeHandle еще больше меняет ситуацию .
Вот мой. : -)
Скажите им, чтобы они всегда использовали оператор использования для одноразовых предметов.
using (MyDisposable obj = new MyDisposable())
{
obj.some_stuff();
} //obj is disposed here