IIf
C#中有等效的东西吗?还是类似的捷径?
Answers:
?
与其他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#的三元运算符。它使用类型推断来知道返回的内容,它实际上是运算符而不是函数。这意味着即使表达式具有函数语义,也不会因预评估表达式而产生问题。
三元运算符
bool a = true;
string b = a ? "if_true" : "if_false";
booleanExpression ? trueValue : falseValue;
例:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
它的局限性在于您不能在其中放置语句。您只能将值(或返回/求值的东西)放入
这有效('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
尽管您可以使用它来做自己想做的事情。
iif
或三元运算符,则让您在其中放置一个返回值(Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
如果它允许),那是可以的,但是显然不能。是的,它仍在设置一个值,不,它不在那里调用任何新方法。