GC.KeepAlive()について何が悪いですか?FxCopがこれを違反のフラグにしますか?なぜFxCopは違反としてGC.KeepAlive()をフラグしますか?
答えて
おそらく、GC.Collect
と呼ぶのは一般的に悪い考えのように、それを呼び出すのは悪い習慣と考えられるため、コレクタには一般的に負の影響があります。また、設計上の欠陥を示す可能性があります。
ただし、呼び出す必要がある場合は、メソッドへの呼び出しを考慮しないようにFxCopを再構成する必要があります。結局のところ、正当な理由があります。
安全でないコードは「一般的に悪い習慣」ではなく、さまざまなフレームワーククラス(WPFの 'WriteableBitmap'など)ではアンマネージポインタが公開されています。ポインタが私が参照を保持する唯一のものであれば、 'GC.KeepAlive'を使うのがよいでしょう。そうしないと悪いことが起こります。 –
GC.KeepAliveは特に悪いのではなく、SafeHandleの使用に変換する場合は不要で、という実際ははSafeHandleの使用法に変換する必要があります。理由がわからない場合は、http://blogs.msdn.com/b/bclteam/archive/2005/03/16/396900.aspxとhttp://blogs.msdn.com/b/bclteam/archive/2006/06/23/644343.aspxをご覧ください。
私はSafeHandleがひどくうまくいくとは思わないケースがあります。たとえば、長命オブジェクトからイベントを受け取るオブジェクトは、有効にファイナライズ可能ではありません。解決策は、オブジェクトのユーザにファイナライズ可能なラッパーへの参照を保持させることであり、ラッパーは主オブジェクトへの参照を保持します。ラッパーをファイナライズすると、オブジェクトのクリーンアップがトリガーされます。そのような場合、ラップされた呼び出しはGC.KeepAlive()を必要とし、SafeHandleがそれを回避する方法はわかりません。 – supercat
あなたの提案されたアプローチがファイナライザ内の管理オブジェクトに触れるように聞こえます。これは、http://msdn.microsoft.com/en-us/library/ddae83kx.aspxで説明されている理由からはお勧めできません。長期存続中のパブリッシャーのイベントに登録する際に、リソースリークを回避するための他の方法もあります。 –
これは常に可能なわけではありません。あなたが忘れている第2のシナリオがあります:ビットマップのバックバッファを取り、それから直接読み取るような、単純なC#ではなく安全でないコードです。これは 'KeepAlive'を保証します。 –
- 1. try/catchがアクセス違反をキャッチしていないのはなぜですか?
- 2. なぜEclipseは `static :: $ var`に反論していますか?
- 3. なぜconst shared_ptrをコピーしてもconstには違反しないのですか?
- 4. fxcopはすべてのルールをチェックしていますか?
- 5. FxCop 'IFormatプロバイダを指定する'はInt32.TryParse違反をキャッチする必要がありますか?
- 6. 制約に違反しましたか?
- 7. プログラム内でアクセス違反(セグメンテーション違反)が発生しました
- 8. NSTemporaryDirectory()はMac App Storeガイドラインに違反していますか?
- 9. Chromeはキャッシュの標準に違反していますか?
- 10. iOSのスタイリングUIオブジェクトはMVCに違反していますか?
- 11. 私のMySQLデザインはデータベースルールに違反していますか?
- 12. 挿入時のユニークな制約違反:なぜですか? (Oracle)
- 13. このODR違反で噛まれないことを保証しますか?
- 14. RelayCommandの一般的な実装はMVVMパターンに違反していますか?
- 15. 流暢なインターフェイスはコマンドクエリ分離原理に違反していますか?
- 16. なぜUIImageViewはUIImageを所有していますか?それはMVCの原則に違反していますか?
- 17. なぜ、ブールは「フラグ」と呼ばれるのですか?
- 18. 何が違法だと思いますか?とguiceはなぜそれを使用していますか?
- 19. セグメンテーション違反私は 'free'を使用してメモリを解放しています
- 20. -ObjCリンカ・フラグは何をしますか?
- 21. has_many =>:Demeterの法則に違反していますか?
- 22. このPHP反復はなぜ機能しませんか?
- 23. なぜgetGeneratedKeys()は列名として "GENERATED_KEY"を返しますか?
- 24. なぜIDEAはJavaDocをエラーとして表示しますか?
- 25. Javaでこの命名規則に違反しているのはなぜですか?
- 26. FXCopは静的ではないため、Application_Start()イベントをキャッチしています
- 27. Vaadinでは、なぜ、ClickListenerインターフェイスでは、インターフェイスメソッドがpublic static Methodオブジェクトとして反映されていますか?
- 28. JSLintはこの機能で厳しい違反エラーを引き起こすのはなぜですか?
- 29. なぜ、antは間違ったディレクトリにtools.jarを探していますか?
- 30. SonarQube msbuildランナーはすべてのfxcopメッセージをインポートしません
@ HansPassant:APIよりもスマートになるとはどういう意味ですか?そして、API関数(これはよく理解された目的を持っています(ここではEric Lippertによって記述されています))を呼び出すために、私はいくつかのテクノロジーを凌駕しなければならないのですか?(http://stackoverflow.com/a/8713997/33225)私は(妥当な)質問をするだけでは賢い人がいないことを示唆しているというあなたの示唆に不快です。 – Timwi
あなたは再びメッセンジャーを撃っています。私はFxCopを書かなかったし、デザイナーの選択に責任を負うこともなかった。 –
@HansPassant:私は、上記のあなたのコメントを完全に引用していました。 – Timwi