无操作 lambda

Posted

技术标签:

【中文标题】无操作 lambda【英文标题】:No-op lambda 【发布时间】:2010-11-09 01:12:01 【问题描述】:

我的一个类上有一个事件,我想附加一个处理程序。但是,我不需要处理程序来做任何事情,因为我只是在测试是否附加了处理程序的类的行为。

事件签名如下:

public event EventHandler<EventArgs> Foo;

所以我想做这样的事情:

myClass.Foo += ();

但是,这不是一个有效的 lambda 表达式。最简洁的表达方式是什么?

【问题讨论】:

有趣的事实:您还可以将空委托附加到事件,这样您就不需要在调用事件之前进行空检查 ***.com/a/1431993/1508243 【参考方案1】:
myClass.Foo += (s,e) => ;

myClass.Foo += delegate ;

【讨论】:

【参考方案2】:
(x,y) =>  //oops forgot the params

好吗? :)

或者

delegate 

【讨论】:

【参考方案3】:

试试这个:

myClass.Foo += delegate ;

【讨论】:

【参考方案4】:

与其事后附加委托,更常见的方法是立即分配:

public event EventHandler<EventArgs> Foo = delegate ;

我更喜欢在这里使用匿名方法语法而不是 lambda 表达式,因为它可以处理各种不同的签名(诚然,不是那些带有 out 参数或返回值的签名)。

【讨论】:

是的,但在这种情况下,我不想分配默认处理程序。 很公平。 (我个人在这些天宣布的几乎每一个事件中都放了一个 :) 在这种情况下,如果没有附加到事件的处理程序,则该类需要具有不同的行为。如果没有人在听它,它会悄悄地自言自语:)【参考方案5】:

试试这个:

myClass.Foo += (s,e) => ;

【讨论】:

【参考方案6】:

通过像这样的 lambda 附加事件:

myClass.Foo += (o, e) => 
    //o is the sender and e is the EventArgs
;

【讨论】:

以上是关于无操作 lambda的主要内容,如果未能解决你的问题,请参考以下文章

lamda

Lambda表达式

Lamda表达式

lambda及stream学习

匿名函数lambda

为啥这个无操作循环没有被优化掉?