gpt4 book ai didi

c# - Lambda 和内存泄漏 : Looking for alternative approaches

转载 作者:太空狗 更新时间:2023-10-30 00:33:13 27 4
gpt4 key购买 nike

编辑:

如果能够验证此类事情的经验丰富的程序员向我展示此方法不会发生内存泄漏的证据,我将不胜感激。我已经将它引入我的许多编码工作中,但我仍然有一个小小的疑问。不幸的是,我不够好/不知道调查它的工具。

原文:

我最近了解到,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;
}

我在这个blog中了解到了这种方法的不良影响.

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

typical approach 之间和 lambda 的使用,理想的折衷是什么?我喜欢 lambda 的一点是,当我不需要它们时,会在我的类主体(发送者/路由参数)中跳过 EventHandler 参数的定义。

最佳答案

很遗憾,您提到的博文是错误的。 lambda 表达式中的内存泄漏不存在一般问题。在博客示例中,终结器从未被调用,因为作者从未从事件中删除匿名方法。因此 .NET 运行时认为该方法可能稍后会被调用,并且无法从内存中删除该类。

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

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

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

关于c# - Lambda 和内存泄漏 : Looking for alternative approaches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com