Iif 在 C# 中等效

Posted

技术标签:

【中文标题】Iif 在 C# 中等效【英文标题】:Iif equivalent in C# 【发布时间】:2010-10-23 19:05:39 【问题描述】:

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

【问题讨论】:

我认为您的意思是“捷径”,而不是“短路”(对于布尔运算符具有特定含义) - 我说的对吗? 【参考方案1】:

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

【讨论】:

VB9 确实支持真正的三元运算符。 If(SomeBool, MessageBox.Show("True"), MessageBox.Show("False")) 如下所示:community.bartdesmet.net/blogs/bart/archive/2007/08/31/… 我在最后一段中提到过,但问题是关于 IIf()。【参考方案2】:

VB.NET:

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

C#

someBool ? "true" : "false";

【讨论】:

虽然这适用于简单表达式,但如果替代表达式中存在副作用,这两种形式并不完全等价。 Iif(t, foo(), bar()) 将同时调用 foo() 和 bar(),而 t ? foo() : bar() 只会调用 foo() 或 bar() 但不会同时调用两者。有关更多信息,请参阅 Joel Coehoorn 对此问题的回答。 更新了答案以使用 VB.NET 的“If”函数而不是“IIf”,这样两个代码块是等效的。【参考方案3】:

三元运算符

bool a = true;

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

【讨论】:

我会在此处添加一条注释,即字符串 b= (a ? "asdf" : "dsrs");也就是说,有可能更好地理解这件事是如何工作的,并看到它不是像 (string b=a) 这样真正奇怪和荒谬的东西? “sdf”:“sdsdf”)。【参考方案4】:

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

VB:

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

C#:

return s ?? "My Default Value";

【讨论】:

【参考方案5】:
booleanExpression ? trueValue : falseValue;

例子:

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

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

【讨论】:

【参考方案6】:

是三元运算符?

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

【讨论】:

【参考方案7】:

它的局限性在于您不能在其中放置语句。您只能将值(或返回/评估为值的事物)返回

这可行('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 或者其他一些语言可以让你在其中放置语句。

【讨论】:

是的,因为它是在设置一个值,而不是调用一个方法。你可以使用Action 做你想做的事。 @KieranFoot WriteLine 是一种方法。已经有一段时间了,但是如果 iif 或三元运算符,让您在其中放置一个返回值,例如 Blah.a = Blah.a &lt; 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;,那么如果它允许,它会起作用,但显然它没有。是的,它仍在设置一个值,不,它没有在那里调用任何新方法。

以上是关于Iif 在 C# 中等效的主要内容,如果未能解决你的问题,请参考以下文章

Access IIF 到 SQL 语句的转换

Nz 和 IIF 的替代方案(为空)

C# 中的 Java Map 等效项

C#中CreateObject的等效代码

C# 中是不是有 .isConnected 功能的 python 等效项

c#中等效的jquery location.pathname