[英]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.