Я вижу много кода, как это:Что такое ожидание IDisposable?
public class MyWcfService : IMySerciceContract, IDisposable
{
private DatabaseOperations _dataAccess;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
_dataAccess.Dispose();
}
}
Где класс MyWcfService будет размещен в IIS или WAS, где никто не будет явно вызывать Dispose на нем. Моя мысль состоит в том, что бессмысленно, чтобы этот класс реализовал IDisposable, и вам было бы лучше отключить использование _dataAccess в инструкции using. Насколько я понимаю, ожидание класса, реализующего IDisposable, заключается в том, что пользователь этого класса будет инстанцировать его в объявлении использования блока. Является ли приведенный выше пример плохой практикой, учитывая, что пользователь не будет явно вызывать Dispose? Если мы полагаемся на GC для очистки, как в приведенном выше примере, делает ли GC даже вызов Dispose или просто финализатором?
Поскольку у вас есть член, который реализует IDisposable, вам следует в идеале реализовать его ... потому что ваш класс стал владельцем. См. Http: // stackoverflow.com/questions/9472304/is-there-any-benef-to-implementation-idisposable-on-classes-which-do-not-have-re ... и http://stackoverflow.com/questions/10956140/does -a-class-need-to-implement-idisposable-when-all-members-are-explicitly-dispo ..... и запускать FXCop для обнаружения любых нарушений IDisposable. Очевидно, что все, что использует ваш тип, должно вызывать Dispose (явно или неявно через использование). –
GC не знает ничего о Dispose или IDisposable. Он просто вызывает финализатор. – Baldrick
Но в случае такого класса обслуживания, где мы даже не ожидаем, что что-то вызовет Dispose, в чем смысл? Зачем мне реализовывать IDisposable, если я знаю, что никто не назовет Dispose? Разве я не буду лучше очищать _dataAccess самостоятельно в этом классе обслуживания? – Didaxis