Lambda和内存泄漏:寻找替代方法

Joe*_*Joe 4 c# events lambda

编辑:

如果有经验的程序员能够验证这种事情,我会证明这种方法可以防止内存泄漏,我会很高兴.我一直在为我的许多编码工作介绍它,但我仍然有一点怀疑.不幸的是,我不够好/不知道调查它的工具.

原版的:

我最近了解到lambda表达式的一些用法可能会造成内存泄漏:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

我在这篇博客中了解到这种方法的不良影响.

我不完全理解在lambda表达式中引用局部变量的影响,这限制了我绕过问题的能力.

典型方法和lambda的使用之间,什么是理想的折衷方案?我喜欢lambda的东西是当我不需要它时跳过我的类体(发送者/路由的args)中的EventHandler参数的定义.

Car*_*tte 8

不幸的是,你提到的博客文章是错误的.lambda表达式中的内存泄漏没有普遍问题.在博客示例中,永远不会调用终结器,因为作者永远不会从事件中删除匿名方法.因此,.NET运行时认为该方法仍可能稍后调用,无法从内存中删除该类.

在您的代码中,您将在某处释放NewProjectUI实例,这是所有事件都未完成以及分配的lambda方法也未被使用的点.然后GC可以删除匿名lambda-helper-class并释放使用过的内存.

所以,再说一遍:在lambda表达式中使用局部变量时,.NET中没有问题.

但是为了使代码更好,将代码从lambda表达式移动到命名方法,并将这些方法添加到事件中.这也使得可以在不再需要时从事件中删除方法.