Ответственность IDisposable
принадлежит объекту, который создает , при отсутствии какого-либо явного соглашения об ином. Противоположные соглашения обычно используются в тех случаях, когда создатель ресурса может не иметь представления о времени жизни потребителя. Я бы предложил, чтобы во многих случаях, когда метод конструктора или фабрики производит то, что может быть последним потребителем переданного IDisposable
, этот метод должен принимать параметр, указывающий, должен ли он принимать ответственность за вызов Dispose
, или принять делегата обратного вызова, который, если не нулевой, будет вызван, когда потребителю больше не нужен объект. Если создатель объекта переживет потребителя, он может передать значение null; если создатель не будет использовать объект после его передачи, он может передать метод объекта Dispose
. Если создатель не знает, переживет ли он потребителя, он может передать метод, который определит, нужен ли еще объект, и вызвать Dispose
, если нет.
Что касается вашего конкретного случая, то создание IDisposable
в цепочечном вызове конструктора является рецептом для утечек ресурсов (поскольку нет способа обернуть цепочечные вызовы конструктора в блок try-finally). Если бы вы как-то обрабатывали это безопасно (например, используя фабричный метод, а не цепочечный конструктор или взлом [threadstatic]
), я бы предположил, что, поскольку создатель объекта (производный класс) будет знать Время жизни потребителя (базовый класс), ответственность за владение и очистку должны оставаться за создателем объекта.