EventHandlers和匿名委托/ Lambda表达式

Nic*_*uso 11 c# events lambda delegates anonymous-methods

我希望用匿名委托和lambda表达式清除一些东西,用于为C#中的事件处理程序创建一个方法,至少对我自己来说.

假设我们有一个事件添加一个匿名委托或一个lambda表达式(对于那些可以使用较新版本.NET的幸运人群).

SomeClass.SomeEvent += delegate(object o, EventArg e) { /* do something */ };
Run Code Online (Sandbox Code Playgroud)

我已经读过,过去的人们已经忘记了仍然有处理程序的事件,这些处理程序会阻止类被垃圾收集.如何在不在类中将SomeEvent设置为null的情况下删除添加的处理程序.以下不是一个全新的处理程序吗?

SomeClass.SomeEvent -= delegate(object o, EventArg e) { /* do something */ };
Run Code Online (Sandbox Code Playgroud)

我可以看到将匿名委托或lambda表达式存储在变量中.但至少对我而言,这似乎打败了能够简单而简洁地添加事件处理程序的全部目的.

SomeEventDelegate handler = new SomeEventDelegate(delegate(object o, EventArg e) { /* do something */ });
SomeClass.SomeEvent += handler;
// ... stuff
SomeClass.SomeEvent -= handler;
Run Code Online (Sandbox Code Playgroud)

我再次理解你可以......

public override Dispose(bool disposing)
{
    _someEvent = null;
    this.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

但是我只是从事件中删除动态创建的方法更有趣.希望有人可以为我揭开这一点.谢谢!

Jon*_*eet 10

如果对象X具有目标为对象Y 的事件处理程序,则对象X处于活动状态意味着不能对对象Y进行垃圾回收.它不会阻止对象X被垃圾收集.

通常当处理某些东西时,它很快就会变成垃圾,这意味着你没有问题.

事件和GC的问题在于,如果您忘记从另一个对象中删除已订阅的处理程序- 即您有一个已处置的侦听器,但永远不会被垃圾收集,因为仍有来自不同对象中的事件的引用.