Iif在C#中等效


Answers:


119

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

为了解释第一个区别,即使布尔参数是,此IIf()调用的false部分参数DivideByZeroException也会导致a True

IIf(true, 1, 1/0)

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

(true)?1:1/0;

另一个区别是IIf()不是类型安全的。它接受并返回类型的参数Object。三元运算符类型安全的。它使用类型推断来知道它正在处理什么类型。请注意,您可以使用自己的通用IIF(Of T)()实现很容易地解决此问题,但实际操作并非如此。

如果您真的想要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和更高版本将提供一个新的If() 运算符,其作用类似于C#的三元运算符。它使用类型推断来知道返回的内容,它实际上是运算符而不是函数。这意味着即使表达式具有函数语义,也不会因预评估表达式而产生问题。


2
VB9确实支持真正的三元运算符。如果(SomeBool,MessageBox.Show( “真”),MessageBox.Show( “假”))作为在这里看到:community.bartdesmet.net/blogs/bart/archive/2007/08/31/...
SNARF

1
我在上一段提到了它,但是问题是关于IIf()的。
乔尔·库洪

61

VB.NET:

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

C#

someBool ? "true" : "false";

1
尽管对于简单表达式而言确实如此,但是如果替代表达式中存在副作用,则这两种形式并不完全等效。Iif(t,foo(),bar())将同时调用foo()和bar(),而t是?foo():bar()将仅调用foo()或bar(),而不是两者。有关更多信息,请参见Joel Coehoorn对这个问题的回答。
格雷格·休吉尔

1
更新了答案,以使用VB.NET的“ If”函数代替“ IIf”,以便两个代码块等效。
凯文·庞

13

三元运算符

bool a = true;

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

我将在其中添加一个注释,该注释为字符串b =(a?“ asdf”:“ dsrs”);也就是说,这样可以更好地了解事物的工作原理,并发现它不是像(string b = a)这样的古怪而荒谬的事物?“ sdf”:“ sdsdf”)。
barlop '16

10

合并运算符??也很有用:

VB:

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

C#:

return s ?? "My Default Value";



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和其他一些语言可以让您在其中放置语句。


是的,因为它是在设置值,而不是在调用方法。Action尽管您可以使用它来做自己想做的事情。
基兰山麓

@KieranFoot WriteLine是一种方法。过了一会儿,但是如果使用iif或三元运算符,则让您在其中放置一个返回值(Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2; 如果它允许),那是可以的,但是显然不能。是的,它仍在设置一个值,不,它不在那里调用任何新方法。
barlop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.