VB.NET - IDisposable を実装するときに Finalize メソッドを追加する必要がありますか?

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

質問

Visual Studio で、「」という行を入力すると、Implements IDisposable" を指定すると、IDE によって以下が自動的に追加されます。

  • ある disposedValue メンバー変数
  • ある Sub Dispose() Implements IDisposable.Dispose
  • ある Sub Dispose(ByVal disposing As Boolean)

Dispose() そのままにし、クリーンアップ コードを追加する必要があります。 Dispose(disposing).

しかし ファイナライズパターンの破棄 オーバーライドする必要もあると言う Sub Finalize() 電話する Dispose(False). 。なぜ IDE もこれを追加しないのでしょうか?自分で追加する必要がありますか、それとも何らかの方法で暗黙的に呼び出されるのでしょうか?

編集: IDE が必要なものの 80% を自動的に追加するのに、Finalize メソッドが省略される理由はわかりますか?この種の機能の要点はあなたを助けることではないでしょうか ない これらのことを忘れますか?

編集2: すばらしい回答をありがとうございました。これで完全に理解できました。

役に立ちましたか?

解決

実際に、ガベージ コレクターによって自動的にクリーンアップされない非マネージド リソースを保持し、それらを Dispose() でクリーンアップする場合は、そうです、Finalize() で同じことを行う必要があります。

他の理由で IDisposable を実装している場合は、Finalize() を実装する必要はありません。

基本的な質問は次のとおりです。Dispose() が呼び出されず、オブジェクトがガベージ コレクションされた場合、メモリ リークが発生するでしょうか?「はい」の場合は、Finalize を実装します。いいえの場合は、その必要はありません。また、「安全だから」という理由だけで Finalize を実装することも避けてください。カスタム ファイナライザーを持つオブジェクトは、オブジェクトを解放するために 2 つの GC パスが必要になる可能性があります。1 回目は保留中のファイナライザー キューに入れ、2 回目は実際にメモリを解放します。

他のヒント

いいえ、クリーンアップする管理対象外のリソースがない限り、Finalize を使用する必要はありません。

ほとんどの場合、クラスが使い捨て可能である理由は、クラスが他のマネージド IDisposable オブジェクトへの参照を保持しているためです。この場合、Finalize メソッドは必要ないか、望ましいものではありません。

Implements IDisposable

Public Overloads Sub Dispose() Implements IDisposable.Dispose

    Dispose(True)
    GC.SuppressFinalize(Me)

End Sub

Protected Overloads Sub Dispose(ByVal disposing As Boolean)

    If disposing Then
        ' Free other state (managed objects).
    End If
    ' Free your own state (unmanaged objects).
    ' Set large fields to null.
End Sub

Protected Overrides Sub Finalize()

    Dispose(False)
    MyBase.Finalize()

End Sub

他の人が言ったように、アンマネージリソースを直接保持しない限り、ファイナライザーを実装する必要はありません。また、.NET 2.0 以降で作業していると仮定すると、通常は SafeHandle を使用してアンマネージ リソースをラップできるため、ファイナライザーを実装する必要はほとんどありません。

私は、 かなり長いブログ投稿 IDisposable とファイナライザーの背景と実装については少し前に説明しました。よく理解していない場合は、読む価値があるかもしれません。

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