問題タブ [suppressfinalize]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
437 参照

c# - SuppressFinalize を複数回呼び出す

何度も電話することのデメリットはありますGC.SuppressFinalize(object)か?Disposeパターン
の 保護されたDispose(bool)メソッドは、以前に呼び出されたかどうかをチェックしますが、パブリックメソッドにはそのようなチェックはありません。Dispose()

インスタンスのDispose()メソッドを複数回呼び出しても問題ありませんか?MyClass

0 投票する
3 に答える
891 参照

c# - ファイナライザーのオーバーヘッド - Dispose で SuppressFinalize を使用する場合と使用しない場合

以下を仮定します。

  • クラスはメンバーのみを管理しています。
  • 一部のメンバーは実装しIDisposableます。
  • クラスはsealed- クラスはアンマネージ リソースから派生したり、追加したりすることはできません。
  • オブジェクトはusingステートメント内で使用されます。つまりDispose()、完了時に呼び出されます。

IDisposableこのクラス には 3 つの可能な実装があります。

  1. メンバーをDispose呼び出す最小限のメソッド - NO finalizerDispose()IDisposable
  2. IDisposableFinalizer を使用した標準的な実装ですが、通常の呼び出しがありません。GC.SuppressFinalize(this)Dispose()
  3. IDisposableFinalizer (およびGC.SuppressFinalize(this)call in ) を使用した完全な標準実装Dispose()

次の記述は正しいですか? 私はこれを正しく理解しましたか?

  1. ケース A. のオーバーヘッドは B. および C. よりもわずかに少なくなります。これは、オブジェクトにファイナライザーがないため、GC のファイナライズ キューに入らないためです。GC はコレクションの早い段階でこのオブジェクトを消去できるため、オーバーヘッドはありません。
  2. ケース B. オブジェクトにファイナライザーがあるため、最終的に GC のファイナライザー キューに入り、ファイナライザーが呼び出されます (抑制されていないため) - ファイナライザーは既に呼び出されているため何もしない dispose を呼び出します。これにより、オブジェクトがファイナライザー キューにあるというわずかなオーバーヘッドと、ファイナライザー呼び出しのごくわずかなオーバーヘッドが発生します。
  3. ケース C. オブジェクトにファイナライザーがあるため、GC のファイナライザー キューに入れられます。disposeSuppressFinalizeが呼び出されたため、ファイナライザーは実行されません。この場合でも、オブジェクトがファイナライザー キューに入るというわずかなオーバーヘッドが発生しますが、ファイナライザーは実際には実行されません。

ここでの重要な点は、「呼び出すことでファイナライザーのオーバーヘッドを回避した」と考えたくなるということですが、それは正しくないSuppressFinalizeと思います (明確にしたいと思います)。ファイナライザー キューにあるオブジェクトのオーバーヘッドは依然として発生します。回避しているのは、実際のファイナライザー呼び出しだけです。一般的なケースでは、「私は既に何もしていません」というだけです。

注: ここでいう「完全な標準IDisposable実装」とは、アンマネージド リソースとマネージド リソースの両方のケースをカバーするように設計された標準実装を意味します (ここでは、マネージド オブジェクト メンバーしかないことに注意してください)。