2011-01-11 6 views
2

GC.KeepAlive()について何が悪いですか?FxCopがこれを違反のフラグにしますか?なぜFxCopは違反としてGC.KeepAlive()をフラグしますか?

+2

@ HansPassant:APIよりもスマートになるとはどういう意味ですか?そして、API関数(これはよく理解された目的を持っています(ここではEric Lippertによって記述されています))を呼び出すために、私はいくつかのテクノロジーを凌駕しなければならないのですか?(http://stackoverflow.com/a/8713997/33225)私は(妥当な)質問をするだけでは賢い人がいないことを示唆しているというあなたの示唆に不快です。 – Timwi

+1

あなたは再びメッセンジャーを撃っています。私はFxCopを書かなかったし、デザイナーの選択に責任を負うこともなかった。 –

+1

@HansPassant:私は、上記のあなたのコメントを完全に引用していました。 – Timwi

答えて

4

おそらく、GC.Collectと呼ぶのは一般的に悪い考えのように、それを呼び出すのは悪い習慣と考えられるため、コレクタには一般的に負の影響があります。また、設計上の欠陥を示す可能性があります。

ただし、呼び出す必要がある場合は、メソッドへの呼び出しを考慮しないようにFxCopを再構成する必要があります。結局のところ、正当な理由があります。

+3

安全でないコードは「一般的に悪い習慣」ではなく、さまざまなフレームワーククラス(WPFの 'WriteableBitmap'など)ではアンマネージポインタが公開されています。ポインタが私が参照を保持する唯一のものであれば、 'GC.KeepAlive'を使うのがよいでしょう。そうしないと悪いことが起こります。 –

3

GC.KeepAliveは特に悪いのではなく、SafeHandleの使用に変換する場合は不要で、という実際ははSafeHandleの使用法に変換する必要があります。理由がわからない場合は、http://blogs.msdn.com/b/bclteam/archive/2005/03/16/396900.aspxhttp://blogs.msdn.com/b/bclteam/archive/2006/06/23/644343.aspxをご覧ください。

+0

私はSafeHandleがひどくうまくいくとは思わないケースがあります。たとえば、長命オブジェクトからイベントを受け取るオブジェクトは、有効にファイナライズ可能ではありません。解決策は、オブジェクトのユーザにファイナライズ可能なラッパーへの参照を保持させることであり、ラッパーは主オブジェクトへの参照を保持します。ラッパーをファイナライズすると、オブジェクトのクリーンアップがトリガーされます。そのような場合、ラップされた呼び出しはGC.KeepAlive()を必要とし、SafeHandleがそれを回避する方法はわかりません。 – supercat

+0

あなたの提案されたアプローチがファイナライザ内の管理オブジェクトに触れるように聞こえます。これは、http://msdn.microsoft.com/en-us/library/ddae83kx.aspxで説明されている理由からはお勧めできません。長期存続中のパブリッシャーのイベントに登録する際に、リソースリークを回避するための他の方法もあります。 –

+0

これは常に可能なわけではありません。あなたが忘れている第2のシナリオがあります:ビットマップのバックバッファを取り、それから直接読み取るような、単純なC#ではなく安全でないコードです。これは 'KeepAlive'を保証します。 –

関連する問題