簡體   English   中英

我真的需要實現Dispose(Boolean)嗎?

[英]Do I really need to implement Dispose(Boolean)?

我正在用一些很舊的代碼編寫一堆類。 許多實現IDisposable接口和Dispose()方法。 但是據我所讀 ,任何實現IDisposable類都應該始終也實現Dispose(Boolean)

甚至Visual Basic生成的用於幫助實現IDisposable的代碼也表明了這一點(對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

它帶有Dispose(Boolean)Dispose()方法,同時對Finalize()方法進行了注釋,這表明它是唯一可選的方法。

但是,令我感到困惑的是,如果我實現Finalize()方法,則Dispose(Boolean)方法似乎已過時,因為從字面上總是使用Dispose(Boolean) disposing == true來調用它。 據我了解,除了添加在堆棧頂部的方法之外,這將導致完全相同的執行邏輯。

我是否缺少某些東西,或者可以安全地拋棄Dispose(Boolean)嗎?

在大多數情況下,實際上您可以跳過該參數,因為您無需進行任何“實際”處理。 但是,假設您的課程是“域控制器+ Active Directory + Web服務器+計划程序”,它們都包裝在一個單一的可怕的上帝課程中。 您上課可能會被告知啄木鳥一遍又一遍地處置,如果沒有該參數,您將無法跟蹤“我已經處置了,可以忽略此額外處置請求”

漢斯·帕桑特(Hans Passant)的評論很好地概括了這種情況。 您看到的很多東西都是遺留的,可能不再需要了,但是“ 20分鍾前”是必要的,自動化是一種祝福。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM