Should IDisposable.Dispose() implementations be idempotent?

前端 未结 4 1248
旧时难觅i
旧时难觅i 2020-12-18 18:28

The Microsoft.NET framework provides the IDisposable interface which requires an implementation of void Dispose() method. Its purpose is to enable

相关标签:
4条回答
  • 2020-12-18 18:52

    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).

    0 讨论(0)
  • 2020-12-18 18:54

    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.

    0 讨论(0)
  • 2020-12-18 19:18

    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
         {
             // ...
         }
    
    }
    
    0 讨论(0)
  • 2020-12-18 19:18

    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.

    0 讨论(0)
提交回复
热议问题