2

コードレビューチェックリストは、次のことを持って?IDisposableとFinalizeにGC.SupressFinalizeを実装する必要がありますか?</p> </blockquote> <p>なぜ廃棄の実装にGC.SupressFinalizeへの呼び出しを持つべき処分とファイナライズを実装</p> <blockquote> <p>クラス - 私の新しいクライアントの代わりに

実装しているクラスとしてIDisposableインターフェイスはDispose実装でGC.SupressFinalizeを呼び出す必要がありますか?

または何か愚かなものがありますか?

答えて

6

あなたは、すべての使い捨てクラスがファイナライザを必要としているわけではないという事実を逃しています - 実際、ごくわずかです、particularly due to .NET 2.0's SafeHandle type。ファイナライザがない場合、なぜSuppressFinalizeに電話する必要がありますか?

1

正確です。 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 
関連する問題