Как уже упоминал Джон, ваша первая точка обозначена правильно.
Иногда метод Close()
функционально является синонимом Dispose()
и существует для поддержания семантической согласованности с абстракцией. То есть, чтобы дополнить метод Open()
. В других случаях Close()
позволит вам снова открыть, но Dispose()
не должен. Таким образом, ваш второй пункт также хорош.
Точка 3 не обязательно применима, поскольку выбрасываемый объект не должен использоваться повторно. Если вам нужно снова вызвать Open()
, вам нужно использовать новый экземпляр. Фактически, метод Open()
должен выдавать ObjectDisposedException
после вызова Dispose()
(путем проверки частного логического disposed
флага). Если вы хотите, чтобы объект поддерживал повторное открытие после закрытия, вы можете рассмотреть возможность использования Debug.Assert()
и / или создания исключения, если Open()
вызывается без Close()
. Это поможет предотвратить небрежное управление этими экземплярами.
Обязательно следуйте полной схеме одноразового использования, которая более сложна, чем простая реализация интерфейса:
bool disposed;
public void Dispose() // don't make virtual!
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// dispose of managed resources here, for example:
// if(resource != null) { resource.Dispose(); }
}
}
// dispose of unmanaged resources here
disposed = true;
}