有没有更好的方式来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());
)