IIf
中是否有C#
个等价物?或类似的捷径?
答案 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和其他一些语言可以让你把语句放在那里。