你需要"unwire"一个匿名函数/ lambda

Max*_*ich 9 c# events lambda anonymous-function event-handling

我的理解是,用C#连接的任何事件处理程序都需要无线连接.

Object myObject = new Object();
myObject.Event += EventHandler; //Wired
myObject.Event -= EventHandler; //Unwired
Run Code Online (Sandbox Code Playgroud)

但是你需要取消以下代码吗?如果是的话,怎么样?

Object myObject = new Object();
myObject.Event += (object sender, EventArgs e) => { }; //Wired
myObject.Event -= ????? //Unwire? How?
Run Code Online (Sandbox Code Playgroud)

我的假设是不是?

Dan*_*rth 10

是的,你需要(*),你需要这样做:

Object myObject = new Object();
EventHandler handler = (object sender, EventArgs e) => { };
myObject.Event += handler; //Wired
myObject.Event -= handler; //Unwired
Run Code Online (Sandbox Code Playgroud)

请看这里的解释.

(*)
由于垃圾收集,您不需要这样做.如果您不希望事件再次调用您的处理程序,则需要执行此操作.

更新:
澄清一点:
唯一的原因,为什么你想取消一个事件处理程序是定义事件处理程序的对象可以被垃圾收集.
想想以下示例:

  • 你有一个PowerSource有活动的课程BlackOut.
  • LightBulb只要有力量,你就有一个课程.它有一种方法ConnectToPowerSource.此方法订阅提供的BlackOut事件PowerSource.
  • 你有一个包含灯泡的集合

现在,只需从列表中删除一个灯泡就不会使它被垃圾收集,因为PowerSource它仍然LightBulb在其BlackOut事件中保存对实例的引用.只有注销后LightBulbBlackOut事件将使LightBulb收集被垃圾.