单呼三元运算符

Bra*_*itz 20 .net c# programming-languages

.NET现在支持null合并运算符

var item = aVal ?? aDefaultVal; 
Run Code Online (Sandbox Code Playgroud)

我可能会忽略一些明显的东西,但对于三元运算符来说有类似的东西,而不是做

var item = aclass.amethod() > 5 ? aclass.amethod() : 5; 
Run Code Online (Sandbox Code Playgroud)

它不需要amethod()两次打电话?

Uwe*_*eim 28

var item = Math.Max(5, aclass.amethod());
Run Code Online (Sandbox Code Playgroud)

  • uwe,适用于这个特殊的数学函数,但我正在寻求一种更通用的方法.我会更新这个问题,谢谢. (3认同)

Can*_*ice 26

怎么样:

var result = aclass.amethod();
var item = result > 5 ? result : 5;
Run Code Online (Sandbox Code Playgroud)

那你只需要打aclass.amethod()一次电话.

  • 伙计们来了,我问是否有一个单独的通话方式.当然你可以定义一个temp var. (2认同)

小智 12

C#中没有这样的运算符.

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

Func<int,int> computation = (x) => x > 5 ? x : 5;
var item = computation(aclass.amethod());
Run Code Online (Sandbox Code Playgroud)

并且在线,这在C#中很难看.

var item = ((Func<int,int>)((x) => x > 5 ? x : 5))(aclass.amethod());
Run Code Online (Sandbox Code Playgroud)

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

var item = DoComputation(aclass.amethod());
Run Code Online (Sandbox Code Playgroud)

并利用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);
Run Code Online (Sandbox Code Playgroud)

快乐的编码.