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

时间:2009-01-08 15:53:01

标签: c# lambda

()似乎很愚蠢。有更好的方法吗?

例如:

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

4 个答案:

答案 0 :(得分:43)

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

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

例如:

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

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

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

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

答案 1 :(得分:23)

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

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

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

ExternalId.IfNotNullDo(SomeMethod);

答案 2 :(得分:19)

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

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

答案 3 :(得分:-1)

基本上你正在寻找的是??空合并运算符的反转(在封面下称为Nullable<T>.GetValueOrDefault()) - 问题是C#没有提供一个简洁的OOTB答案。 / p>

不知道你正在做什么,但正如你所做的那样:

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

您可能还会找到以下用途:

class NullExtensions
{
    public T DefaultOr<T>( this T that, Func<T> transform)
    {
        return that!=default(T) ? transform(that) : default(T);
    }
}

将启用:

var result = input.DefaultOr( _ => _.Trim());

(一般情况下,我会尝试避免重复使用/变异变量,而不是按照介绍解释变量/分割临时变量的方向,即使用新变量而不是{{1 }})