Es ist genau. Wenn die Dispose (bool) -Methode ihren Zweck erfüllt hat, gibt es keinen Grund mehr, dass der Finalizer dies erneut tun kann. Das Aufrufen von GC.SuppressFinalize() ist eine Optimierung. Sie verhindern, dass .NET einen Finalizer aufruft, der nichts tut.
Ich bemerkte, dass Sie Klasse mit einem Kapital C geschrieben haben. Das ist ein Hinweis, dass Sie Ihren Code in VB.NET schreiben. Passen Sie auf, die IDE macht die falsche Sache in 99,99% aller Fälle. Sobald Sie die Eingabetaste drücken, nachdem "Implementiert IDisposable" eingeben, fügt es die falsch Code:
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
Yuck. Das ist die Boilerplate-Implementierung eines Finalizers, die in der MSDN Library btw gut dokumentiert ist. Es ist falsch. Es ist extrem selten einen Finalizer zu benötigen, die .NET-Klassen kümmern sich schon selbst darum. Wenn Sie wirklich ein Betriebssystem-Handle verwenden, sollten Sie eine der SafeHandle-abgeleiteten Klassen verwenden. Oder schreibe deinen eigenen Wrapper.
bearbeiten sie diese zurück:
Public Sub Dispose() Implements IDisposable.Dispose
someField.Dispose()
'' maybe some more
''...
End Sub