正確です。 Dispose(bool)メソッドがその仕事をした場合、ファイナライザにもう一度やり直す必要はなくなりました。 GC.SuppressFinalize()を呼び出すことは最適化で、.NETが何もしないファイナライザを呼び出すのを止めさせます。
私は、あなたが大文字のCでクラスを書いたことに気付きました。あなたがVB.NETでコードを書いているというヒントです。 IDEがをと間違っているのは、すべてのケースの99.99%です。
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
ウエッ:できるだけ早くあなたが「を実装IDisposableを」と入力した後Enterキーを押すと、それは間違ったコードを挿入します。これは、MSDNライブラリbtwによく書かれているファイナライザの定型的な実装です。それは間違っています。実際にファイナライザが必要なことは非常にまれですが、.NETクラスはすでにそれを処理しています。実際にオペレーティングシステムハンドルを使用する場合は、SafeHandle派生クラスの1つを使用する必要があります。または独自のラッパーを作成します。これに
編集、それをバック:
Public Sub Dispose() Implements IDisposable.Dispose
someField.Dispose()
'' maybe some more
''...
End Sub