()
似乎很愚蠢。有更好的方法吗?
例如:
ExternalId.IfNotNullDo(() => ExternalId = ExternalId.Trim());
答案 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 }})