在c#中的iif等价物

Sai*_*han 71 .net c# iif-function ternary-operator

有没有IIf等价的C#?还是类似的捷径?

Joe*_*orn 110

?与其他C风格的语言一样,C#具有三元运算符.但是,这并不完全等同于IIf(); 有两个重要的区别.

为了解释第一个区别,这个IIf()调用的false-part参数会导致a DivideByZeroException,即使boolean参数是True.

IIf(true, 1, 1/0)
Run Code Online (Sandbox Code Playgroud)

IIf()只是一个函数,和所有函数一样,在调用之前必须评估所有参数.换句话说,IIf()确实没有短路传统意义上的.另一方面,这个三元表达式确实短路,因此非常好:

(true)?1:1/0;
Run Code Online (Sandbox Code Playgroud)

另一个区别是IIf()不安全.它接受并返回类型的参数Object.三元运算符类型安全的.它使用类型推断来了解它正在处理的类型.请注意,您可以使用自己的通用IIF(Of T)()实现轻松解决此问题,但开箱即用并非如此.

如果你真的想要IIf()C#,你可以拥有它:

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}
Run Code Online (Sandbox Code Playgroud)

或通用/类型安全的实现:

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想在VB中使用三元运算符,Visual Studio 2008及更高版本提供了一个像C#的三元运算符一样工作的新If() 运算符.它使用类型推断来知道它返回的内容,它实际上是一个运算符而不是一个函数.这意味着预先计算表达式没有问题,即使它具有函数语义.

  • VB9确实支持真正的三元运算符.如果(SomeBool,MessageBox.Show("True"),MessageBox.Show("False"))如下所示:http://community.bartdesmet.net/blogs/bart/archive/2007/08/31/visual-基本-9-0-的-IF-三元operator.aspx (2认同)

Kev*_*ang 58

VB.NET:

If(someBool, "true", "false")
Run Code Online (Sandbox Code Playgroud)

C#

someBool ? "true" : "false";
Run Code Online (Sandbox Code Playgroud)

  • 虽然对于简单表达式来说确实如此,但如果替代表达式中存在副作用,则这两种形式并不完全相同。Iif(t, foo(), bar()) 将调用 foo() 和 bar(),而 t ? foo() : bar() 只会调用 foo() 或 bar() 之一,但不会同时调用两者。有关更多信息,请参阅 Joel Coehoorn 对此问题的回答。 (2认同)

Ris*_*ams 12

三元运算符

bool a = true;

string b = a ? "if_true" : "if_false";
Run Code Online (Sandbox Code Playgroud)


Joh*_*ibb 8

同样有用的是coalesce运算符??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )
Run Code Online (Sandbox Code Playgroud)

C#:

return s ?? "My Default Value";
Run Code Online (Sandbox Code Playgroud)