0

通常情况下,匿名事件处理程序可以按如下方式释放:

    EventHandler hdl = null;
    hdl += (ss,ee) =>
    {
       //....
       MyObj.Completed -= hdl;            
       hdl = null;
    };

    MyObj.Completed += hdl;            
    MyObj.AsyncCall();

我的问题是:hdl = null;最新版本的 C# 是否需要?此版本还有更简单的解决方案或更简单的语法吗?

4

2 回答 2

0

一些东西:

  1. 简单的设置hdl = null不会释放您的处理程序以进行垃圾收集,因为 MyObj.Completed 仍将保存对处理程序的引用。(但MyObj.Completed -= hdl在这种情况下会照顾它,所以你应该没问题。)
  2. 您不必+=在分配给 hdl 时使用。你应该只使用简单的 assignment =
  3. 相反,如果您的 lambda 是命名方法,则可以使用MyObj.Completed += MyCallbackNameand MyObj.Completed -= MyCallbackName。如果您需要在关闭时捕获的东西,这不起作用,但我从您的示例中看不到这一点。
于 2012-08-14T19:14:00.570 回答
0

不,这不是必需的。这基本上都与捕获上下文(编译器生成的类)相关联;一旦事件被取消订阅,任何东西都不会将捕获上下文保持在范围内,因此它将有资格进行垃圾收集。hdl擦除变量(实际上是捕获上下文中的一个字段)没有任何好处(但没有真正的危害)。

于 2012-08-14T19:14:11.630 回答