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 < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
,那么如果它允许,它会起作用,但显然它没有。是的,它仍在设置一个值,不,它没有在那里调用任何新方法。以上是关于Iif 在 C# 中等效的主要内容,如果未能解决你的问题,请参考以下文章