Когда вы получаете ресурсы в ctor, которые не подлежат сборке мусора, вы должны обязательно утилизировать их, когда дела идут на юг.
В этом примере показан ctor, который предотвратитпри утечке, когда что-то идет не так, применяются те же правила, когда вы распределяете одноразовые материалы внутри фабричного метода.
class Sample
{
IDisposable DisposableField;
...
public Sample()
{
var disposable = new SomeDisposableClass();
try
{
DoSomething(disposable);
DisposableField = disposable;
}
catch
{
// you have to dispose of it yourself, because
// the exception will prevent your method/ctor from returning to the caller.
disposable.Dispose();
throw;
}
}
}
Редактировать : мне пришлось сменить образец с фабрики на ктор, потому чтоочевидно, это было не так легко понять, как я надеялся.(Судя по комментариям.)
И, конечно, причина этого такова: когда вы звоните на фабрику или ctor, вы можете распоряжаться только его результатом.Когда вызов проходит, вы должны предположить, что все в порядке.
При вызове ctor или factory вам не нужно выполнять обратный психоанализ, чтобы избавиться от чего-то, что вы не можете достатьв любом случае.Если оно выдает исключение, то фабрики / ctor обязаны очистить все, что было выделено наполовину, перед повторным выбрасыванием исключения.(Надеюсь, на этот раз это было достаточно тщательно продумано ...)