我有这段代码,LongMethodWithResult
是一个需要很长时间才能运行的方法:
object o = LongMethodWithResult() == someVal ? LongMethodWithResult() : someOtherResult;
现在LongMethodWithResult
方法被评估了两次,不是吗?
我知道我可以编写一个使用变量来存储long方法结果的方法,如下所示:
public static object ConciseConditionalOperator(object a, object b, object c)
{
return a == b ? a : c;
}
但我感兴趣的是,是否有最佳方式,或者C#或.NET提供的某些功能。
欢迎任何想法!
答案 0 :(得分:5)
在这种特殊情况下,你可以使用它:
object o = LongMethodWithResult() == someVal ? someVal : someOtherResult;
如果您更喜欢不同的表示法,或者如果您想避免两次指定someVal
,那么您可以创建一个Extension方法(在静态类中):
public static T IfEqualThenElse<T>(this T valueToCheck, T value1, T value2)
where T : System.IEquatable<T>
{
return valueToCheck.Equals(value1) ? value1 : value2;
}
用法:
var o = LongMethodWithResult().IfEqualThenElse(someVal, someOtherResult);
答案 1 :(得分:1)
一般来说,你是对的。在您的示例中,http.createServer(onRequest).listen(process.env.PORT || 6000)
执行两次。为避免这种情况,您需要先存储LongMethodWithResult
的结果:
LongMethodWithResult
正如彼得B在你的回答中所说,你提供的例子是一个特殊情况,你不需要那样,因为var result = LongMethodWithResult();
object o = result == someVal ? result : someOtherResult;
的结果等于你已经知道的价值,那里& #39;不需要再打电话。您只需返回您已知的值即可。
但是,通常需要以下内容:
LongMethodWithResult()
但是,您可以使用简单的替换最后一个构造:
var result = LongMethodWithResult();
object o = result == null ? defaultResult : result;