82

C#中是否有IIf等价物?或者类似的捷径?

4

7 回答 7

123

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# 的三元运算符。它使用类型推断来知道它返回了什么,它实际上是一个运算符而不是一个函数。这意味着预评估表达式没有问题,即使它具有函数语义。

于 2009-05-05T01:06:46.940 回答
63

VB.NET:

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

C#

someBool ? "true" : "false";
于 2009-05-05T00:49:05.140 回答
13

三元运算符

bool a = true;

string b = a ? "if_true" : "if_false";
于 2009-05-05T00:49:03.097 回答
10

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

VB:

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

C#:

return s ?? "My Default Value";
于 2009-05-05T01:05:51.310 回答
5
booleanExpression ? trueValue : falseValue;

例子:

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

http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html

于 2011-12-08T02:04:03.667 回答
1

这是三元运算符?

string newString = i == 1 ? "i is one" : "i is not one";
于 2009-05-05T00:49:03.783 回答
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 或者其他一些语言可以让您在其中放置语句。

于 2016-04-20T11:29:31.720 回答