Класс Foo
обычно должен реализовывать IDisposable в двух случаях:
- По крайней мере, некоторые экземпляры `Foo` будут знать о какой-то задаче, которая должна когда-нибудь произойти, но которая не вероятна для других объектовделать это своевременно, и они будут знать, что рассматриваемая задача может быть безопасно выполнена, если они сами больше не нужны.
- По крайней мере, некоторые классы, производные от `Foo`, удовлетворяют указанным выше критериям и имеют свои последние полезные ссылки, содержащиеся в коде, который ожидает работать с ними как тип` Foo`, а не как более производный тип.
Что-то вроде Bitmap
соответствует первой категории, так как при создании он запрашивает у Windows дескриптор GDI для эксклюзивного использования, что означает: (1) Что-то должно сказать Windows, когда этот дескриптор небольше нужно;(2) Если растровое изображение этого не делает, больше ничего не будет;(3) Как только Bitmap
больше не нужен, дескриптор GDI может быть безопасно удален.
Что-то вроде Stream
соответствует второй категории.Базовый класс не знает ни о каких конкретных вещах, которые нужно будет сделать, прежде чем экземпляр можно будет безопасно покинуть, но многие производные классы будут иметь такие требования.Кроме того, во многих случаях объект может создать Stream
с целью передачи его другому объекту, а затем больше не использовать для себя.Объект, создающий Stream
, не должен заботиться о том, когда второй объект завершает работу с потоком, а объект, получающий Stream
, не должен беспокоиться о том, действительно ли это тип, требующий очистки или нет.Вместо этого самый простой шаблон - для создателя Stream
передать его в методе, который дает понять, что получатель должен очистить его, и чтобы получатель вызвал Dispose
, не беспокоясь о том, действительно ли метод делает это.что-нибудь в конкретном типе это было дано.