作者:贾志军 | 2023-09-01 11:25
在()
似乎很傻.有没有更好的办法?
例如:
ExternalId.IfNotNullDo(() => ExternalId = ExternalId.Trim());
1> Charlie Flow..:
有点!镇上有一个新的成语,这很好,在某些情况下可能会帮助你.它并不完全是你想要的,但有时候我觉得你会喜欢它.
由于下划线("_")是一个有效的C#标识符,因此在计划无论如何都要忽略参数的情况下,将它用作lambda的参数名称变成了一种常见的习惯用法.如果其他程序员知道这个习语,他们会立即知道该参数是无关紧要的.
例如:
ExternalId.IfNotNullDo( _ => ExternalId=ExternalId.Trim());
易于打字,传达您的意图,也更容易在眼睛上.
当然,如果你将lambda传递给需要表达式树的东西,这可能不起作用,因为现在你传递的是单参数lambda而不是no-parameter lambda.
但在许多情况下,这是一个很好的解决方案.
我真的不知道这比()更好.稍微丑陋的伪语法交换稍微丑陋的语法似乎不是一个胜利.
单参数lambda是牧师,双参数lambda是野兽.但我会打赌条纹睡衣,你从未见过三参数lambda.
嗯,你绝对欢迎你的意见.这是一个主观问题.但对我来说,它大大减少了视觉混乱,更容易阅读,更容易打字.原始问题的动机是不喜欢()语法,因此这提供了另一种选择.
在F#中,_是一个matchall模式,因此在使用C#时很有相似性.我的许多事件处理程序看起来像"foo + =(_,__)......".
我必须同意@Greg; 它看起来不比`()`好.此外,它没有回答这个问题,因为下划线方法不适用于无参数lambda.如果我打算忽略这些参数,我会使用`delegate {...}`忽略*参数(参见Mark的回答).
@CharlieFlowers:不管OP的反应如何,它确实*不会回答这个问题.您的lambda表达式是否无参数,如问题中所述?不可以.您的代码*不能用于没有参数的代理.
当*是*参数时我对这种模式很好.我只是说它没有回答被问到的问题,这是关于一个*没有*参数的lambda表达式.对实际问题的正确答案是,"不,没有其他方法可以编写无参数的lambda表达式." (顺便说一下,我没有回答这个问题 - 我认为这并不是主动无益的,我只是不认为它回答了OP提出的问题.如果OP实际上是在试图问别的话,那就是另一件事......)
对于熟悉Scala的开发人员,使用下划线(`_`)可能会令人困惑/误导; 我的公司开发了botch C#和Scala.在Scala中,您可以使用`_`字符替换lambda表达式中的一次性使用变量.例如,`(x,y)=> x + y`可以用`_ + _`代替.出于这个原因,我真的不喜欢使用`_`来达到这个目的.[更多信息](http://stackoverflow.com/questions/7673545/usage-of-in-scala-lambda-functions)关于Scala使用`_`.
2> Marc Gravell..:
对于lambda,不,你需要 () =>
是代表还是表达?对于代表来说,另一种选择是delegate {...}
.根据情况,这可能是也可能不是所希望的.这是更多的关键,当然......
在某些情况下(不是这个)你可以直接使用目标方法 - 即
ExternalId.IfNotNullDo(SomeMethod);
3> Jon Skeet..:
不,没有.Lambda表达式针对单个参数情况进行了优化(就语法而言).
我知道C#团队感受到了你的痛苦,并试图寻找替代方案.是否会有一个是另一回事.
@aateeque:我认为它根本不回答这个问题.它给出了如何使用您计划忽略的一个参数编写lambda表达式的想法,但这与无参数的lambda不同.