1

使用 C#,我有一个方法,其中我有这个代码(名称已更改)-

private void func(...)
{
   ClassName c = new ClassName();

   c.EventName += delegate 
                  {
                    //do some work
                  };
}

现在当方法退出时,事件处理程序会被垃圾收集,还是会保留在内存中?

4

2 回答 2

4

当 c 实例被垃圾收集时,它将被垃圾收集。您无需执行任何操作即可将其删除。一旦方法完成,c 实例就有资格进行垃圾收集。

于 2013-09-17T05:04:53.337 回答
3

这是来自 MSDN,

要防止在引发事件时调用您的事件处理程序,只需取消订阅该事件即可。为了防止资源泄漏,在处理订阅者对象之前取消订阅事件很重要。在您取消订阅某个事件之前,发布对象中作为该事件基础的多播委托具有对封装订阅者事件处理程序的委托的引用。只要发布对象持有该引用,您的订阅者对象就不会被垃圾回收。

您可以按如下方式取消订阅事件,

  publisher.RaiseCustomEvent -= HandleCustomEvent;
于 2013-09-17T05:12:43.233 回答