回答

1

這是準確的。如果Dispose(bool)方法完成了它的工作,那麼再也沒有任何意義讓終結器再次執行它了。調用GC.SuppressFinalize()是一種優化,您可以停止.NET,因爲它無法調用不執行任何操作的終結器。

我注意到你用大寫字母C寫了Class。這暗示你在VB.NET中編寫你的代碼。注意,IDE在99.99%的所有情況下都會執行錯誤的事情。只要你按輸入「實現IDisposable」後回車鍵,插入錯誤代碼:

Private disposedValue As Boolean = False  ' To detect redundant calls 

    ' IDisposable 
    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
       ' TODO: free other state (managed objects). 
      End If 

      ' TODO: free your own state (unmanaged objects). 
      ' TODO: set large fields to null. 
     End If 
     Me.disposedValue = True 
    End Sub 

#Region " IDisposable Support " 
    ' 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(ByVal disposing As Boolean) above. 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 
#End Region 

呸。這是一個終結器的樣板實現,在MSDN Library btw中有詳細記錄。這是不對的。實際上需要一個終結器是非常罕見的,.NET類已經自己處理它。如果你真的使用操作系統句柄,那麼你應該使用其中一個SafeHandle派生類。或者寫你自己的包裝。

編輯回本:

Public Sub Dispose() Implements IDisposable.Dispose 
    someField.Dispose() 
    '' maybe some more 
    ''... 
End Sub 
相關問題