我需要删除这种事件处理程序吗?

jsc*_*edl 5 .net c# delegates

如果我创建一个.NET类,用这样的匿名函数订阅一个事件:

void MyMethod()
{
   Application.Current.Deactivated += (s,e) => { ChangeAppearance(); };
}
Run Code Online (Sandbox Code Playgroud)

这个事件处理程序是否会使我的类不被垃圾收集?

如果没有,喔!但如果是这样,你能告诉我删除语法吗?只使用 - =使用相同的代码似乎是错误的.

Jon*_*Jon 3

您可以使用 Simon D. 建议的“真实”方法,或者执行以下操作:

EventHandler handler = null;
handler = (s,e) => { 
    Application.Current.Deactivated -= handler;
    ChangeAppearance();
};
Application.Current.Deactivated += handler;
Run Code Online (Sandbox Code Playgroud)

由于这有点难看并且违背了使用 lambda 简洁的目的,因此我可能会将其重构为一种方法。但了解其他有效的方法很有用。

警告:不用说,您必须非常小心,不要弄乱handler订阅事件的点和实际调用事件的点之间的值,否则取消订阅部分将无法正常工作。