web-dev-qa-db-ja.com

C#でのiif相当

C#IIfと同等のものはありますか?または同様のショートカット?

69
Saif Khan

C#には、他のCスタイル言語と同様に、?三項演算子があります。ただし、これはIIf()と完全に同等ではありません。 2つの重要な違いがあります。

最初の違いを説明するために、ブール引数がDivideByZeroExceptionであっても、このIIf()呼び出しのfalse-part引数によりTrueが発生します。

IIf(true, 1, 1/0)

IIf()は単なる関数であり、すべての関数と同様に、呼び出しを行う前にすべての引数を評価する必要があります。別の言い方をすれば、IIf()notを従来の意味で短絡させます。一方、この3項式は短絡するので、まったく問題ありません。

(true)?1:1/0;

他の違いは、IIf()はタイプセーフではありません。タイプObjectの引数を受け入れて返します。三項演算子is type safe。型推論を使用して、どの型を扱っているかを把握します。独自の汎用IIF(Of T)()実装でこれを非常に簡単に修正できることに注意してください。ただし、そのままではありません。

C#でIIf()が本当に必要な場合は、それを使用できます。

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以降では、C#の三項演算子のように機能する新しいIf()operatorを提供します。型推論を使用して、何が返されるかを認識します。実際には、関数ではなく演算子です。これは、関数のセマンティクスがありますが、式を事前評価しても問題がないことを意味します。

107
Joel Coehoorn

VB.NET:

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

C#

someBool ? "true" : "false";
57
Kevin Pang

三項演算子

bool a = true;

string b = a ? "if_true" : "if_false";
11
Ris Adams

合体演算子も便利ですか??:

VB:

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

C#:

return s ?? "My Default Value";
8
John Gibb
booleanExpression ? trueValue : falseValue;

例:

string itemText = count > 1 ? "items" : "item";

http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html

5
Zamir

三項演算子?です

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

そこにステートメントを入れることができないという点で制限されています。値(または値に戻る/評価するもの)のみを入れて返すことができます

これは動作します( 'a'はBlahクラス内の静的intです)

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

(丸括弧は暗黙的に等号と疑問符の間にあります)。

これは機能しません。

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

そのため、値を返すためにc#三項演算子のみを使用できます。したがって、ifの短縮形とはまったく異なります。 Javascriptおよびおそらく他のいくつかの言語を使用すると、そこにステートメントを配置できます。

0
barlop