4

バックグラウンド

Visual Studio 2008 で新しい Windows フォーム アプリケーションを作成します。これにより、"Form1" というクラスを持つスケルトン プロジェクトが作成されます。VS2008 は Dispose() メソッドを自動的に作成します。

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

私は同僚のオフィス (上級開発者) に迷い込みました - 素晴らしい人で、スマートで、チャットの優れたデザインスキルです - しかし、彼が入力していることに気付きました - 彼がコードベースをナビゲートしたとき、VS2008 が作成した Dispose() メソッドのこのセクションを削除しましたフォーム用。

        if (disposing && (components != null))
        {
            components.Dispose();
        }

それで、その理由を聞いたところ、保管する必要はないとのことでした。

質問

  • このコードを削除しても安全ですか?
  • そのままにしておくか、削除することの長所と短所は何ですか?
4

2 に答える 2

7

いいえ、このコードを削除するのは安全ではありません。いくつかのコンポーネントは、保持している管理されていないリソースを適切に解放するために、このパターンの有効性に依存しています。このコードを削除すると、アプリケーションは 95% の確率で動作する可能性があります。ただし、5% のケースは、リソース リーク、メモリ リークの可能性、非決定論的バグなどとして表示されます。一般的に、問題を追跡するのは困難です。

使い捨てのリソースを処理する最善の方法は、使用しなくなった瞬間に破棄することです。このプラクティスに従うことで、今後の多くの頭痛の種から解放されます。このコードを削除すると、正反対のアプローチが取られます。

SO に関するこの投稿には、より詳細な説明が含まれています: When should I dispose my objects in .NET?

于 2008-12-20T07:14:30.863 に答える
5

フォームでSystem.Windows.Forms.Timerのようなものを使用する可能性がわずかにある場合は、絶対に削除しないでください。そして、これは常に可能性があります。

フォームが閉じたときにタイマーを破棄するのはこのコードであり、タイマーを破棄しない場合は実行を継続します。このタイプのバグが導入されたコードのいくつかのビットを引き継ぎました(.NET 2.0より前のこのメカニズムはあまりうまく機能しませんでした)、そして更新する必要のあるフォームが閉じた後ずっと実行されているタイマーによって引き起こされる断続的なパフォーマンスの問題本当に苦痛になる可能性があります。

これを削除しても現実的なメリットはありません。コンポーネントリストにコントロールが追加されていない場合、components.Dispose()を実行するのは簡単です。コントロールリストに追加された場合、それはそれらを破棄する必要があるためです。

于 2008-12-20T08:19:32.950 に答える