有没有更好的方式来expression一个无参数lambda比()=>?

()似乎很愚蠢。 有没有更好的办法?

例如:

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

有点! 在城里有一个新的成语,这很好,在某些情况下可以帮助你。 这不完全是你想要的,但有时我想你会喜欢它。

由于下划线(“_”)是一个有效的C#标识符,所以在计划无视参数的情况下,将它用作lambda的参数名已经成为一种常见的习惯用法。 如果其他编码者知道这个习语,他们会立即知道这个参数是不相关的。

例如:

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

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

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

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

对于lambda,no:你需要() =>

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

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

 ExternalId.IfNotNullDo(SomeMethod); 

不,没有。 Lambdaexpression式针对单个参数情况进行了优化(按照语法)。

我知道C#团队感到你的痛苦,并试图find一个替代scheme。 是否会有一个是另一回事。

基本上你正在寻找的是相反的?? 空合并运算符(这被称为Nullable<T>.GetValueOrDefault()下) – 问题是C#不提供一个整齐的OOTB答案。

不知道你在做什么,但是你在做什么:

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

你也可以find一个用途:

 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()); 

(一般来说,我会试图摆脱重用/变异的variables,因为你似乎在做,而不是在介绍解释variables/拆分临时variables方向,即使用一个新的variables,而不是value = value.DefaultOr( _ => _.Trim());