单呼三元运算符

时间:2011-02-04 20:58:23

标签: c# .net programming-languages

.NET现在支持null coalescing operator

var item = aVal ?? aDefaultVal; 

我可能会忽略一些显而易见的事情,但三元运算符是否存在类似的东西,而不是做

var item = aclass.amethod() > 5 ? aclass.amethod() : 5; 

不需要两次致电amethod()

3 个答案:

答案 0 :(得分:28)

var item = Math.Max(5, aclass.amethod());

答案 1 :(得分:26)

怎么样:

var result = aclass.amethod();
var item = result > 5 ? result : 5;

您只需要拨打一次aclass.amethod()

答案 2 :(得分:12)

C#中没有内置此类运算符。

虽然我选择其中一个答案(使用Math.Max的答案可以说对于发布的示例更明确),但这只是为了展示另一种方法。遗憾的是,计算需要一个显式类型的变量。

Func<int,int> computation = (x) => x > 5 ? x : 5;
var item = computation(aclass.amethod());

并且在线,这在C#中只是丑陋。

var item = ((Func<int,int>)((x) => x > 5 ? x : 5))(aclass.amethod());

当然,以上两点都归结为:

var item = DoComputation(aclass.amethod());

并利用C#不使用pass-by-name的事实: - )

或者,也许是一种扩展方法:

static class Ext {
  public static TO Apply<TI,TO> (this TI obj, Func<TI,TO> fn) {
    return fn(obj);
  }
}

// note C# now lets us get away with no explicit Func<...> type
var item = Ext.Apply(aclass.amethod(), x => x > 5 ? x : 5);

// or as extension method -- imagine computation is as it was in the
// first example, or a compatible method group
var item = aclass.amethod().Apply(computation);

快乐的编码。