在c#中的iif等价物

时间:2009-05-05 00:47:27

标签: c# .net ternary-operator iif-function

IIf中是否有C#个等价物?或类似的捷径?

7 个答案:

答案 0 :(得分:105)

C#拥有?三元运算符,就像其他C风格的语言一样。但是,这并不完全等同于IIf();有两个重要的区别。

要解释第一个区别,此IIf()调用的false-part参数会导致DivideByZeroException,即使布尔参数为True

IIf(true, 1, 1/0)

IIf()只是一个函数,与所有函数一样,所有参数必须在调用之前进行求值。换句话说,IIf()传统意义上的短路。另一方面,这个三元表达式确实是短路的,因此非常好:

(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及更高版本提供了一个新的If() 运算符,它就像C#的三元运算符一样。它使用类型推断来知道它返回的内容,它实际上是一个运算符而不是一个函数。这意味着预先计算表达式没有问题,即使它具有函数语义。

答案 1 :(得分:56)

VB.NET:

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

C#

someBool ? "true" : "false";

答案 2 :(得分:11)

三元运算符

bool a = true;

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

答案 3 :(得分:8)

合并运算符??:

也很有用

VB:

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

C#:

return s ?? "My Default Value";

答案 4 :(得分:5)

booleanExpression ? trueValue : falseValue;

示例:

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

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

答案 5 :(得分:1)

这是三元运算符?

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

答案 6 :(得分:0)

这是有限的,因为你不能把声明放在那里。您只能将值(或返回/评估值的值)返回

这有效('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和其他一些语言可以让你把语句放在那里。