加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 你需要“不知道”一个匿名函数/ lambda

发布时间:2020-12-15 06:53:38 所属栏目:百科 来源:网络整理
导读:我的理解是,在C#中连接的任何事件处理程序都需要这样做. Object myObject = new Object();myObject.Event += EventHandler; //WiredmyObject.Event -= EventHandler; //Unwired 但是,您是否需要拒绝以下代码?如果是,怎么样? Object myObject = new Object(
我的理解是,在C#中连接的任何事件处理程序都需要这样做.
Object myObject = new Object();
myObject.Event += EventHandler; //Wired
myObject.Event -= EventHandler; //Unwired

但是,您是否需要拒绝以下代码?如果是,怎么样?

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

我的假设是否定的?

解决方法

是的,你需要(*),你需要这样做:
Object myObject = new Object();
EventHandler handler = (object sender,EventArgs e) => { };
myObject.Event += handler; //Wired
myObject.Event -= handler; //Unwired

请参阅here以获得解释.

(*)
垃圾收集不需要这样做.你需要这样做,如果你不想让事件再调用你的处理程序.

更新:
澄清一下:
唯一的原因,为什么你想不想要一个事件处理程序是定义事件处理程序的对象可以被垃圾回收.
想想下面的例子:

>你有一个PowerSource类与事件BlackOut.
>你有一个LightBulb类,只要有权力就可以了.它有一个方法ConnectToPowerSource.此方法订阅所提供的PowerSource的BlackOut事件.
>您有一个包含灯泡的集合

现在,从列表中删除一个灯泡将不会使其收集垃圾,因为PowerSource仍然在其BlackOut事件中引用LightBulb实例.只有在从BlackOut事件中注销LightBulb之后,LightBulb才能收集垃圾.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读