100%管理されたリソースであり、ストリームや大きなリソースを含まないオブジェクトにIDisposableを実装するように求められています。

大きなリソースと管理されていないリソースを適切に破棄することの重要性を理解していますが、方程式の反対側はどうですか?

IDisposableを実装してもメリットがないオブジェクト(完全に管理された小さなオブジェクト)の場合、GC.SuppressFinalizeが持つ可能性のある悪影響はありますか?

コメント

  • 時期尚早の最適化のようです。この場合にIDisposableを追加するとメモリフットプリントが改善されることを示す、プロファイリングとベンチマークから得られた結果を実行するように依頼した人に依頼する立場にありますか?
  • @MainMaいいえ、でもそれでも'とにかく質問するのを止めませんでした。その結果、"の5分間の応答が得られました。これは私たちがいつも行ってきた方法です'あなたもそうします"。
  • そうですね、デストラクタ/ファイナライザを記述せずにIDisposableを実装することは可能です。 ' IDisposableの実装を依頼した人が、デストラクタも作成する必要があるかどうかはわかりません。もちろん、クラスにデストラクタがない場合、GC.SuppressFinalizeには意味がありません。クラスにデストラクタがある場合は、Disposeメソッドが実行されたら、必ずGC.SuppressFinalize(this)と言ってください。そうしないと、インスタンスはガベージコレクションされにくく、ファイナライザキューに入れられ、第2世代の収集でのみ収集されます。
  • @JeppeStigNielsen質問では、オブジェクトが完全に管理されていることを示しています。リソースがあるため、'ファイナライザーは必要ありません。そこにある場合は、'が間違っていることがわかります。

回答

GC.SuppressFinalizeの唯一の目標は次のとおりです。

ファイナライザーが管理されていないリソースを解放しないようにするIDisposable.Disposeの実装によってすでに解放されています。

出典:MSDN

オブジェクトを破棄したら、に示すように、GC.SuppressFinalize(this);を呼び出す必要があります。 GC.SuppressFinalize()はいつ使用する必要がありますか? “。コード分析 “ CA1816 ルールも役立ちます。

現在、IDisposableを実装しています管理されていないリソースを持たないオブジェクトは、非常に奇妙で疑わしいように見えます。その人があなたに与えた唯一の理由は、IDisposable特定のケースで何かを改善しますが、実際にそれを行う理由はありません。

パフォーマンスの問題を引き起こしますか?言うのは難しいです:特定のケースに依存します。

もちろん、他の問題が発生しますか?もちろん、IDisposableの実装が面倒であるという事実を考慮しないと、この方法を使いすぎると、コードが読み取れなくなり、維持できなくなります。

public int ComputePrice(Rebate rebate) { using (var currentCurrency = this.User.FindCurrency()) { using (var priceWithoutRebate = this.GetPurePrice()) { using (var canApplyRebate = rebate.CanApplyTo(this)) { if (!canApplyRebate) { return priceWithoutRebate; } using (var priceWithRebate = priceWithoutRebate.Apply(rebate)) { return priceWithRebate; } } } } } 

コメント

  • 話は、昔、彼らには何らかのつながりがあったということだと思います/おそらく接続/コマンドのADO.NETコードのリークが原因で、ストリームリークの問題が発生し、これにより大量のリソースリークが発生しました。すべてにIDisposableを実装することで問題が解決することを知っていたので、問題は解決しました。ほとんどのオブジェクトに実装する必要があります。
  • @AndrewHoffman:もっともらしい説明のようです。しかし、それでも'現在の慣行を正当化するものではありません。

回答

IDisposableクラスで重い(「痛みを伴う」)Dispose + Finalizerパターンを使用する必要はありません。 if クラスは封印されており、クラスには管理されていないリソースはありません。

そのような状況では、パブリックDispose()にはファイナライザーがなく、クラスは封印されています。

クラスを封印する理由は、「子クラスに管理されていないリソースがある場合はどうなるか」という問題を回避するためです。および「将来、子クラスに管理されていないリソースがある場合はどうなりますか?」

以前MicrosoftのJoeDuffyが、、およびすべての順列サブセットの実装。

この記事の寄稿者には、Herb Sutter、Brian Grunkemeyer、Jeff Richter、およびその他のC#の著名人が含まれます。この記事は、MSDNに掲載されているものよりもはるかに詳細です。

残念ながら、Joe Duffyの新しいブログエンジンは2005年の元の記事をうまく保存できていないため、多少混乱しているように見えます。リンクは次のとおりです: http://joeduffyblog.com/2005/04/08/dg-update-dispose-finalization-and-resource-management/

JoeDuffyの記事全体を含むMS-Wordドキュメントをもっとうまく添付できたらいいのにと思います フォーマット。 🙁

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です