The Microsoft.NET framework provides the IDisposable
interface which requires an implementation of void Dispose()
method. Its purpose is to enable
should the implementation of the
Dispose()
method be idempotent
Yes, it should. There is no telling how many times it will be called.
From Implementing a Dispose Method on MSDN:
a Dispose method should be callable multiple times without throwing an exception.
An object with a good implementation of IDispose
will have a boolean field flag indicating if it has been disposed of already and on subsequent calls do nothing (as it was already disposed).
From MSDN:
Allow a Dispose method to be called more than once without throwing an exception. The method should do nothing after the first call.
Yes, also make sure the other methods of the class respond correctly when they are called when the object has already been disposed.
public void SomeMethod()
{
if(_disposed)
{
throw new ObjectDisposedException();
}
else
{
// ...
}
}
Personally - Yes - I always make Dispose() idempotent.
During the usual life-cyle of an object in a given application it may not be necessary - the life-cyle from creation to disposal may be deterministic and well known.
However, equally, in some applications it might not be so clear.
For example, in a decorator scenario: I may have a disposable object A, decorated by another disposable object B. I may want to explicitly dispose A, and yet Dispose on B may also dispose the instance it wraps (think: streams).
Given it is relatively easy to make Dispose idempotent (ie if already disposed, do nothing), it seems silly not to.