2009-05-05 16 views
58

C#にはIIfがありますか?または同様のショートカット?iif相当のC#

+3

「ショートサーキット」(ブール演算子に関して特定の意味を持つ)ではなく、「ショートカット」を意味すると思います。そうですか? – Blorgbeard

答えて

95

C#が有します "?"他のC言語と同様に、三項演算子である。しかし、これはiifと完全には同じではありません。重要な違いが2つあります。

は最初を説明するために、式が真であるにも関わらず iifは単なる機能であり、すべての引数は呼び出し前に評価されなければならないのでDIVIDEBYZERO例外が発生します。この iif()コール:

iif(true, 1, 1/0) 

は、別の言い方をすれば、IIFあなたの質問が示すように、の伝統的な意味で短絡していません。一方、この三元表現はありませんので、完全に罰金です:

(true)?1:1/0; 

他の違いはiifがタイプセーフされていないということです。それはタイプobjectの引数を受け入れて返します。三項演算子は型推論を使用して、どの型を扱っているかを知る。一般的な実装でこれを非常に簡単に修正できますが、それはそのままの状態で行うことができます。

あなたが本当に(IIF場合)C#で、あなたはそれを持つことができます。

object iif(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart; } 

またはジェネリック/タイプセーフな実装:一方

T iif<T>(bool expression, T truePart, T falsePart) 
{ return expression?truePart:falsePart;} 

、あなたがしたい場合VB、Visual Studio 2008以降の3進演算子は、新しいIfオペレータを提供します。この演算子はC#の3進数のように機能します。それは型推論を使用して戻り値が何であるかを知り、それは関数ではなく演算子なので、関数のセマンティクスを持っていても式を事前評価することで問題はありません。

+2

VB9は真の三項演算子をサポートしています。 If(SomeBool、MessageBox.Show( "True")、MessageBox.Show( "False")) ここにあるように:http://community.bartdesmet.net/blogs/bart/archive/2007/08/ 31/visual-basic-9-0-the-if​​-ternary-operator.aspx – snarf

+1

最後の段落で言及しましたが、質問は特にIIf()に関するものでした。 –

11

三項演算子

bool a = true; 

string b = a ? "if_true" : "if_false"; 
+0

私はそこに文字列b =(a? "asdf": "dsrs")というコメントを追加します。つまり、それがどのように動作するかをよりよく理解し、それが本当に奇妙で無意味なものではないことを見ることが可能です(文字列b = a)? "sdf": "sdsdf")。 – barlop

1

それは?

string newString = i == 1 ? "i is one" : "i is not one"; 
47

VB.NET三項演算子です:

If(someBool, "true", "false") 

C#

someBool ? "true" : "false"; 
+1

これは単純な式に当てはまりますが、代替式に副作用がある場合、2つの形式は完全に等価ではありません。 Iif(t、foo()、bar())はfoo()とbar()の両方を呼び出します。 foo():bar()はfoo()またはbar()のどちらか一方だけを呼び出しますが、両方を呼び出すことはできません。詳細については、この質問に対するJoel Coehoornの答えを参照してください。 –

+1

"IIf"ではなくVB.NETの "If"関数を使用して、2つのコードブロックが同等になるように更新されました。 –

7

も有用で??合体演算子である:

VB:

Return Iif(s IsNot Nothing, s, "My Default Value") 

C#:

return s ?? "My Default Value"; 
0

あなたがそこに文を置くことができないという点で制限されています。あなただけ(丸括弧の間impicitlyある

Blah.a=Blah.a<5?1:8; 

(「」クラス何とか内の静的なint型である)

この作品を返すために、値(または値に評価さ/戻る事を)置くことができます等号と疑問符)。

これは機能しません。

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er"); 
or 
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er"); 

したがって、戻り値にはc#3値演算子しか使用できません。だから、ifの短縮形のようなものではありません。 Javascriptやその他の言語では、そこに文を入れることができます。