通常,匿名事件处理程序可以按如下方式发布:
EventHandler hdl = null;
hdl += (ss,ee) =>
{
//....
MyObj.Completed -= hdl;
hdl = null;
};
MyObj.Completed += hdl;
MyObj.AsyncCall();
我的问题是:最新版本的C#需要hdl = null;
吗?此版本还有更简单的解决方案或更简单的语法吗?
答案 0 :(得分:0)
一些事情:
hdl = null
将不会释放您的处理程序以进行垃圾收集,因为MyObj.Completed仍将保留对处理程序的引用。 (但MyObj.Completed -= hdl
在这种情况下会照顾它,所以你应该没问题。)+=
。您应该使用简单的作业=
。MyObj.Completed += MyCallbackName
和MyObj.Completed -= MyCallbackName
。如果您需要在闭包中捕获的东西,这不起作用,但我没有从您的示例中看到。答案 1 :(得分:0)
不,不是必需的。这基本上都与捕获上下文(编译器生成的类)相关联;一旦事件被取消订阅,任何东西都不会将捕获上下文保留在范围内,因此它将有资格进行垃圾回收。擦除变量hdl
(实际上是捕获上下文中的字段)没有任何好处(但没有真正的伤害)。