C#中是否有IIf
等价物?或者类似的捷径?
7 回答
C# 有?
三元运算符,就像其他 C 风格的语言一样。但是,这并不完全等同于IIf()
; 有两个重要的区别。
为了解释第一个区别,此IIf()
调用的 false-part 参数会导致 a DivideByZeroException
,即使布尔参数是True
。
IIf(true, 1, 1/0)
IIf()
只是一个函数,并且像所有函数一样,必须在调用之前评估所有参数。换一种说法,不IIf()
短路传统意义上的短路。另一方面,这个三元表达式确实短路了,所以非常好:
(true)?1:1/0;
另一个区别是IIf()
类型不安全。它接受并返回 type 的参数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# 的三元运算符。它使用类型推断来知道它返回了什么,它实际上是一个运算符而不是一个函数。这意味着预评估表达式没有问题,即使它具有函数语义。
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 或者其他一些语言可以让您在其中放置语句。