4

編集:

この種のことを検証する能力を持つ経験豊富なプログラマーが、この方法がメモリリークから安全であるという証拠を私に示してくれたら素晴らしいと思います。私はそれを私のコーディングの取り組みの多くに紹介してきましたが、それでも私の心には小さな疑問があります。残念ながら、私は十分ではありません/それを調査するためのツールを知りません。

オリジナル:

最近、ラムダ式を使用するとメモリリークが発生する可能性があることを学びました。

    ProjectData Project;

    void OnLaunchNewProject()
    {
        NewProjectUI newProjectUI = new NewProjectUI();
        newProjectUI.OnCompleted += (o, e) =>
            {
                Project = newProjectUI.NewProject;
                view.Content = string.Format("Project {0} was created and saved successfully.", Project.Name);
            };
        newProjectUI.OnCancelled += (o, e) => { view.Content = "Operation was cancelled.";};
        view.Content = newProjectUI;
    }

このブログでこの方法の悪影響を学びました。

ラムダ式でローカル変数を参照することの影響を完全には理解していません。これにより、問題を回避する能力が制限されます。

典型的なアプローチとラムダの使用の間で、理想的な妥協点は何ですか?ラムダについて私が気に入っているのは、クラスの本体(送信者/ルーティングされた引数)でのEventHandlerの引数の定義を、必要のないときにスキップすることです。

4

1 に答える 1

8

残念ながら、あなたが言及したブログ投稿は間違っています。ラムダ式のメモリリークに関する一般的な問題はありません。ブログの例では、作成者がイベントから匿名メソッドを削除することはないため、ファイナライザーが呼び出されることはありません。そのため、.NETランタイムは、メソッドが後で呼び出される可能性があると見なし、クラスをメモリから削除できません。

コードでは、NewProjectUIインスタンスをどこかでリリースします。これは、すべてのイベントが実行されなくなり、割り当てられたラムダメソッドも使用されなくなるポイントです。次に、GCは匿名のlambda-helper-classを削除し、使用済みメモリを解放できます。

つまり、ラムダ式でローカル変数を使用する場合、.NETでは問題はありません。

ただし、コードを改善するには、コードをラムダ式から名前付きメソッドに移動し、これらのメソッドをイベントに追加します。これにより、メソッドが不要になったときにイベントからメソッドを削除することもできます。

于 2012-10-20T15:29:09.307 に答える