mercredi 13 juin 2018

Do I really need to implement Dispose(Boolean)?

I am working on a bunch of classes in some pretty old code. Many implement the IDisposable interface and the Dispose() method. But from what I have read, any class implementing IDisposable should always also implement Dispose(Boolean).

Even the code generated by Visual Basic to help implement IDisposable suggest this (sorry about the VB..):

#Region "IDisposable Support"
    Private mDisposed As Boolean

    ' IDisposable
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not mDisposed Then
            If disposing Then
                ' TODO: dispose managed state (managed objects).
            End If

            ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
            ' TODO: set large fields to null.
        End If
        mDisposed = True
    End Sub

    ' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
    'Protected Overrides Sub Finalize()
    '    ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
        Dispose(True)
        ' TODO: uncomment the following line if Finalize() is overridden above.
        ' GC.SuppressFinalize(Me)
    End Sub
#End Region

It comes with a Dispose(Boolean) and a Dispose() method, while the Finalize() method is commented, suggesting it is the only thing that is optional.

What I find confusing however is, if I don't implement the Finalize() method, the Dispose(Boolean) method seemingly becomes obsolete, as it will literally always be called with disposing == true. From my understanding this would result in the exact same execution logic, apart from the method added on top of the stack.

Am I missing something or can I safely ditch Dispose(Boolean)?

Aucun commentaire:

Enregistrer un commentaire