使用条件运算符的简明方法

时间:2016-12-05 09:56:24

标签: c# conditional-operator

我有这段代码,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提供的某些功能。

欢迎任何想法!

2 个答案:

答案 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;