是否有更好的方法来表达无参数的lambda而不是()=>?

bre*_*win 39 c# lambda

()似乎很傻.有没有更好的办法?

例如:

ExternalId.IfNotNullDo(() => ExternalId = ExternalId.Trim());

Cha*_*ers 43

有点!镇上有一个新的成语,这很好,在某些情况下可能会帮助你.它并不完全是你想要的,但有时候我觉得你会喜欢它.

由于下划线("_")是一个有效的C#标识符,因此在计划无论如何都要忽略参数的情况下,将它用作lambda的参数名称变成了一种常见的习惯用法.如果其他程序员知道这个习语,他们会立即知道该参数是无关紧要的.

例如:

ExternalId.IfNotNullDo( _ => ExternalId=ExternalId.Trim());
Run Code Online (Sandbox Code Playgroud)

易于打字,传达您的意图,也更容易在眼睛上.

当然,如果你将lambda传递给需要表达式树的东西,这可能不起作用,因为现在你传递的是单参数lambda而不是no-parameter lambda.

但在许多情况下,这是一个很好的解决方案.

  • 我真的不知道这比()更好.稍微丑陋的伪语法交换稍微丑陋的语法似乎不是一个胜利. (46认同)
  • 单参数lambda是牧师,双参数lambda是野兽.但我会打赌条纹睡衣,你从未见过三参数lambda. (7认同)
  • 嗯,你绝对欢迎你的意见.这是一个主观问题.但对我来说,它大大减少了视觉混乱,更容易阅读,更容易打字.原始问题的动机是不喜欢()语法,因此这提供了另一种选择. (5认同)
  • 在F#中,_是一个matchall模式,因此在使用C#时很有相似性.我的许多事件处理程序看起来像"foo + =(_,__)......". (4认同)
  • 我必须同意@Greg; 它看起来不比`()`好.此外,它没有回答这个问题,因为下划线方法不适用于无参数lambda.如果我打算忽略这些参数,我会使用`delegate {...}`忽略*参数(参见Mark的回答). (4认同)
  • @CharlieFlowers:不管OP的反应如何,它确实*不会回答这个问题.您的lambda表达式是否无参数,如问题中所述?不可以.您的代码*不能用于没有参数的代理. (2认同)
  • 当*是*参数时我对这种模式很好.我只是说它没有回答被问到的问题,这是关于一个*没有*参数的lambda表达式.对实际问题的正确答案是,"不,没有其他方法可以编写无参数的lambda表达式." (顺便说一下,我没有回答这个问题 - 我认为这并不是主动无益的,我只是不认为它回答了OP提出的问题.如果OP实际上是在试图问别的话,那就是另一件事......) (2认同)
  • 对于熟悉Scala的开发人员,使用下划线(`_`)可能会令人困惑/误导; 我的公司开发了botch C#和Scala.在Scala中,您可以使用`_`字符替换lambda表达式中的一次性使用变量.例如,`(x,y)=> x + y`可以用`_ + _`代替.出于这个原因,我真的不喜欢使用`_`来达到这个目的.[更多信息](http://stackoverflow.com/questions/7673545/usage-of-in-scala-lambda-functions)关于Scala使用`_`. (2认同)

Mar*_*ell 23

对于lambda,不,你需要 () =>

是代表还是表达?对于代表来说,另一种选择是delegate {...}.根据情况,这可能是也可能不是所希望的.这是更多的关键,当然......

在某些情况下(不是这个)你可以直接使用目标方法 - 即

ExternalId.IfNotNullDo(SomeMethod);
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 19

不,没有.Lambda表达式针对单个参数情况进行了优化(就语法而言).

我知道C#团队感受到了你的痛苦,并试图寻找替代方案.是否会有一个是另一回事.

  • @aateeque:我认为它根本不回答这个问题.它给出了如何使用您计划忽略的一个参数编写lambda表达式的想法,但这与无参数的lambda不同. (10认同)