代碼評審列表,在我的新客戶的地方有以下 -我應該在IDisposable和Finalize上實現GC.SupressFinalize嗎?
類實現處置並最終確定應該有GC.SupressFinalize來電處置實施
爲什麼?
它應該不讀爲類實現IDisposable接口應在Dispose實現中調用GC.SupressFinalize?
或者我錯過了一些愚蠢的東西?
代碼評審列表,在我的新客戶的地方有以下 -我應該在IDisposable和Finalize上實現GC.SupressFinalize嗎?
類實現處置並最終確定應該有GC.SupressFinalize來電處置實施
爲什麼?
它應該不讀爲類實現IDisposable接口應在Dispose實現中調用GC.SupressFinalize?
或者我錯過了一些愚蠢的東西?
你錯過了一個事實,即不是每個一次性班都需要終結者 - 事實上,很少有這樣的事,particularly due to .NET 2.0's SafeHandle
type。如果沒有終結者,爲什麼你需要撥打SuppressFinalize
?
這是準確的。如果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