GC.SuppressFinalizeは、ファイナライザーを持たないオブジェクトで呼び出す必要がありますか?

StackOverflow https://stackoverflow.com/questions/621152

  •  05-07-2019
  •  | 
  •  

質問

何らかの理由で FXCopが考えているようですファイナライザを持っているかどうかに関係なく、DisposeのGC.SuppressFinalize。

何か不足していますか?ファイナライザが定義されていないオブジェクトでGC.SuppressFinalizeを呼び出す理由はありますか?

役に立ちましたか?

解決

ILには常にファイナライザがあります-System.Object.Finalize()はすべてのクラスに存在するため、カスタムクラスを作成する場合は、抑制したいファイナライザがあります。ただし、すべてのオブジェクトがファイナライズキューに置かれるわけではないため、独自のファイナライザーを実装する場合は、技術的にファイナライズを抑制する必要があるだけです。

IDisposable を実装してアンマネージリソースをラップする場合は、ファイナライザを含める必要があります。理論的には Dispose が呼び出されます。

他のヒント

次の場合を除き、Disposeで GC.SuppressFinalize(this)を呼び出す必要はありません。

  • あなたは、オーバーライドを目的とした仮想Disposeメソッドを実装する基本クラスです(ここでも、それはあなたの責任ではないかもしれませんが、その場合はそれを行いたいかもしれません)
  • 自分でファイナライザを持っています。技術的には、.NETのすべてのクラスにはファイナライザーがありますが、存在するファイナライザーが Object にある場合、オブジェクトはファイナライズを必要とは見なされず、GCのファイナライズリストに追加されません

上記のいずれにも該当しない場合は、そのメッセージを無視しても安全だと思います。

c#デストラクタを使用して実装していない場合でも、すべてのオブジェクトにファイナライザメソッドがあります(実際にはGCによって呼び出されることが保証されているわけではありません)。 IDisposableを実装している場合は、明示的にファイナライズを実行することにしたので、呼び出しを抑制することをお勧めします。

devxの記事

ファイナライザが定義されていない場合、SuppressFinalize()を呼び出す必要はありません。防御的になりたい場合は、ファイナライザーとDispose()を用意することをお勧めします。そのため、常にDispose()を呼び出すためにクライアントに依存する必要はありません。そうすれば、忘れたときにリソースが漏れることはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top