C# C中的Iif当量#

C# C中的Iif当量#,c#,.net,conditional-operator,iif-function,C#,.net,Conditional Operator,Iif Function,C#中是否有IIf等价物?或类似的快捷方式?三元运算符 bool a = true; string b = a ? "if_true" : "if_false"; 这是三元运算符? string newString = i == 1 ? "i is one" : "i is not one"; VB.NET: If(someBool, "true", "false") C# 合并操作符也很有用??: VB: C#: 与其他C风格语言一样,C#具有?三元运算符。然而,这并不完全等同于IIf

C#中是否有
IIf
等价物?或类似的快捷方式?

三元运算符

bool a = true;

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

这是三元运算符

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

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


合并操作符也很有用??:

VB:

C#:

与其他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;}
T IIf(布尔表达式、T truePart、T falsePart)
{返回表达式?truePart:falsePart;}
另一方面,如果希望在VB中使用三元运算符,Visual Studio 2008及更高版本将提供一个新的
if()
运算符,该运算符与C#的三元运算符类似。它使用类型推断来知道它返回的是什么,它实际上是一个运算符而不是一个函数。这意味着预计算表达式不会产生任何问题,即使它具有函数语义

booleanExpression ? trueValue : falseValue;
例如:

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

它的局限性在于不能将语句放在其中。您只能将值(或返回/计算为值的对象)放入

这是有效的('a'是类Blah中的静态int)


Blah.a=Blah.aVB9支持真正的三元运算符。这里看到的If(SomeBool,MessageBox.Show(“True”),MessageBox.Show(“False”):我在最后一段中提到了它,但问题是关于IIf()的。虽然这对于简单表达式是正确的,但如果替代表达式中存在副作用,这两种形式并不完全相同。Iif(t,foo(),bar())将同时调用foo()和bar(),而t?foo():bar()将只调用foo()或bar(),但不能同时调用两者。有关更多信息,请参阅Joel Coehoorn对此问题的回答。更新了答案,使用VB.NET的“If”函数而不是“IIf”,这样两个代码块是等效的。我认为您的意思是“shortcut”,而不是“shortcircuit”(对于布尔运算符有特定含义)——对吗?我会在这里添加一条注释,即字符串b=(a?“asdf”:“dsrs”);也就是说,这样就可以更好地理解这个东西是如何工作的,并看到它不是像(字符串b=a)这样的奇怪和荒谬的东西。“sdf”:“sdf”)。是的,因为它是在设置一个值,而不是调用一个方法。您可以使用
操作
来做您想做的事情。@KieranFoot WriteLine是一种方法。有一段时间了,但是如果
iif
或三元运算符,让您在其中输入一个返回值,如
Blah.a=Blah.a<4?控制台写入线(“asdf”);返回1:Console.WriteLine(“34er”);返回2T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}
booleanExpression ? trueValue : falseValue;
string itemText = count > 1 ? "items" : "item";
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");