2011-02-04 39 views
20

.NETは、今では代わりにシングルコール三項演算子

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

をやって、そのようなことを、私は何かを明らかに見下ろすことかもしれないが、三項演算子のための同様のものがあるnull coalescing operator

var item = aVal ?? aDefaultVal; 

をwouldnサポートしていますamethod()を2回呼び出す必要がありますか?あなただけにして、一度aclass.amethod()を呼び出す必要が

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

:どの程度

+7

* 3進演算子を意味しますか? :) – Mehrdad

+1

ちょうどFYI、その演算子は*合体*演算子です。 SQLの 'COALESCE()'とよく似ています。 –

+0

moo、それは正しいです、合体のための類似した.net関数はありますか?そしておそらくショートカット版ですか? –

答えて

12

C#にはそのような演算子が組み込まれていません。

私は答えの1(間違いなくより明確に掲示例えばあるMath.Maxを使用しています1)を選択するだろうが、これはちょうど別の方法を示したものです。計算に明示的に型付けされた変数が必要であることは残念です。

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#は、おそらく、

:-)名前によるパスまたは使用しないことを利用拡張方法:

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); 

ハッピーコーディング。

+0

拡張メソッドルートはソリューションに最も近いです。おかげで –

+0

@boomhauer "あまりにもトリッキーな"注意してください。拡張メソッドを使うのは簡単ですが、終わりにはC#はC#です(F#やScalaや言語X ;-)ではなく –

+0

私は完全に同意しますが、一時的なバールをこの場所を回避する場所;) –

26

+0

+1メソッドを一度だけ呼び出す場合は – JYelton

+0

と+1を明確にする必要があります。 – NotMe

+2

人が来ています。もちろん、一時変数を定義することもできます。 –

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

この例の簡潔な処理のための+1 – JYelton

+1

+1は非常に興味深いアプローチです。 – NotMe

+0

ありがとう、@クリス。 –