Простое правило, которому нужно следовать: если вы создаете * это, вы несете ответственность за его удаление. И наоборот, если метод (будь то конструктор или другой) не создает одноразовый объект, я не ожидал бы, что он избавится от него. (* Создание включает в себя вызов методов, которые возвращают IDisposable.)
Итак, что-то вроде
public Foo(SomeDisposable obj) : base(obj) { }
Я бы ожидал увидеть что-то вроде
using (SomeDisposable obj = new SomeDisposable())
{
Foo foo = new Foo(obj);
}
а не
Foo foo = new Foo(new SomeDisposable());
Если у вас есть конструктор без параметров для Foo
и вы хотите вызвать базовый конструктор с помощью одноразового объекта, вы попадаете в более хитрое положение, и, вероятно, именно в этом состоит правило, пытаясь защитить вас. , Я бы сказал, избегайте такой позиции, либо кодируя базу для создания и, следовательно, отвечая за IDisposable, либо создавайте отображение 1: 1 между конструкторами с параметрами IDisposable, чтобы Foo без параметров не вызывал параметризованную базу.
Но метод или конструктор не должны догадываться, что вы закончили с объектом, который передали, потому что как он должен знать? Вы могли бы использовать его для других целей.