-
03-07-2019 - |
質問
C#
に相当する IIf
はありますか?または同様のショートカット?
解決
C#には、他のCスタイル言語と同様に、?
三項演算子があります。ただし、これは IIf()
と完全に同等ではありません。 2つの重要な違いがあります。
最初の違いを説明するために、この IIf()
呼び出しのfalse-part引数により、ブール引数が True であっても、
DivideByZeroException
が発生します。コード>。
IIf(true, 1, 1/0)
IIf()
は単なる関数であり、すべての関数と同様に、呼び出しを行う前にすべての引数を評価する必要があります。別の言い方をすれば、 IIf()
は従来の意味での短絡ではありません 。一方、この3項式は短絡するので、まったく問題ありません。
(true)?1:1/0;
他の違いは、 IIf()
はタイプセーフではないことです。タイプ Object
の引数を受け入れ、返します。三項演算子は 型安全です。型推論を使用して、どの型を扱っているかを把握します。独自の汎用 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()
演算子が提供されます。型推論を使用して、何が返されるかを認識します。実際には、関数ではなく演算子です。つまり、関数のセマンティクスがありますが、式を事前評価しても問題はありません。 他のヒント
VB.NET:
If(someBool, "true", "false")
C#
someBool ? "true" : "false";
三項演算子
bool a = true;
string b = a ? "if_true" : "if_false";
合体演算子も便利ですか??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C#:
return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;
例:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c -vb-equivalent-of-iif.html
これは三項演算子?
string newString = i == 1 ? "i is one" : "i is not one";
そこにステートメントを配置できないという点で制限されています。値(または値に戻る/評価するもの)のみを入れて返すことができます
これは機能します( '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およびおそらく他のいくつかの言語では、そこにステートメントを入れることができます。