В некоторых ситуациях объект будет использовать одноразовый ресурс, срок полезного использования которого превышает срок службы нового объекта, который его использовал.Будут другие ситуации, когда можно будет передать объект объекту, который ничего не знает ни о каких одноразовых элементах внутри него.Некоторые типы объектов могут оказаться использованными в обоих сценариях.
Рассмотрим гипотетический тип IDisposable SoundPlayer, который будет воспроизводить объект IDisposable SoundSource, а затем утилизировать себя, когда это будет сделано.Легко представить себе ситуации, когда хочется иметь возможность загрузить SoundSource один раз, воспроизвести его несколько раз, а затем вручную утилизировать.Также легко представить себе ситуации, когда нужно загрузить объект SoundSource, а затем «запустить и забыть» проигрыватель.Создатель SoundSource не может утилизировать его до тех пор, пока игрок не закончит, но впоследствии он будет бесполезен, поэтому наиболее удобный способ действий для SoundPlayer - избавиться от него.
Я бы предположил, чтоесли оба сценария по меньшей мере правдоподобны, вы должны либо предоставить фабричный метод, который передает владение IDisposable вместе с тем, который этого не делает, либо у вас должен быть фабричный метод с параметром, который указывает, следует ли передать владение.Обратите внимание, что передача IDisposables в конструкторы для классов, которые должны их использовать и утилизировать, опасна, поскольку Microsoft не позволяет блокировать блоки try / catch вокруг конструкторов, вызываемых из инициализаторов полей, и трудно гарантировать, что что-то будет удалено при выдаче конструктора.При вызове фабричного метода конструктор значительно упрощает перехват ошибок (хотя это по-прежнему сложно - особенно в C #).
Edit - Addendum Другой подход, который иногда полезен, заключается впусть объект либо опубликует событие Disposed, либо примет делегат в своем конструкторе для запуска, когда переданный объект больше не нужен.Я предпочитаю явный делегат на событие, так как использование события подразумевает, что подписчик события (человек, создающий объект, который временно будет хранить одноразовый ресурс) обязан отказаться от подписки, что добавляет дополнительные сложности, особенно если объект может бытьпередал еще один объект.Поскольку наиболее распространенная вещь, которую вызывающий объект захочет сделать, когда получатель объекта больше не нуждается в том, чтобы объект был просто удален, простейший случай - просто иметь возможность для получателя объекта обрабатывать удаление самостоятельно..