可能重复:
iif equivalent in c#
我在VB中使用IIf
有几行代码,我试图将此代码转换为C#。
以下是我需要帮助的示例:
intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0)
如何将上面的代码行更改为C#? C#中是否有短路评估操作符?
答案 0 :(得分:38)
对于C#三元/条件运算符 close 正如几个人所建议的那样,但它并不是一个确切的替代品。 C#三元运算符执行短路评估,这意味着只会发生评估子句的副作用。在VB.Net中,Iif
函数不实现短路,并将评估两种副作用。
另外,VB.Net中的Iif
函数是弱类型的。它接受并返回键入为Object
的值。 C#三元运算符是强类型的。
您可以写的最接近的等价物如下。将值放入参数会强制评估其副作用。
public static object Iif(bool cond, object left, object right) {
return cond ? left : right;
}
或稍微更实用
public static T Iif<T>(bool cond, T left, T right) {
return cond ? left : right;
}
答案 1 :(得分:16)
是的,这是问号(A.K.A conditional operator)。
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
答案 2 :(得分:4)
这非常迂腐,但C#中最接近的IIf
是
intCurrency = ((Func<bool, object, object, object>)((x, y, z) => x ? y : z))(or.Fields["Currency"].Value == "USD", 100, 0);
但是,我想知道你是否真的对VB的三元运算符感兴趣。所以VB中的以下内容
intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0)
可以更好地写成(注意IIf
和If
之间的差异)
intCurrency = If(or.Fields("Currency").Value = "USD", 100, 0)
在C#中与
完全相同intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
另一个有趣的观点是If
兼作空合并运算符。
Dim text As String = Nothing
text = If(text, "Nothing")
在C#中与
完全相同string text = null;
text = text ?? "null";
答案 3 :(得分:3)
我知道其他人已经回答了这个......但我想我会澄清一下。如果您对更多阅读感兴趣,则称为ternary operator或通常称为条件运算符。
答案 4 :(得分:2)
这是?:运营商。
or.Fields["Currency"].Value == "USD" ? 100 : 0;
答案 5 :(得分:1)
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
答案 6 :(得分:1)
您可以使用?:运算符执行等效代码:
intCurrency = or.Fields["Currency"].Value = "USD" ? 100 : 0;
答案 7 :(得分:1)
正如其他人所说,你正在寻找conditional operator:
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
然而,作为纠正点,这不是“短路评估”。短路评估意味着一旦可以可靠地确定布尔表达式,就不会进行进一步的评估(这相当于在true
表达式中遇到or
条件或在false
条件中遇到and
条件if
表达式。)
虽然可以在条件运算符中组合布尔表达式,就像在其他任何事情中一样(如Iif
语句),并且表达式将采用短循环评估,但它不会使用条件运算符无法做任何事情本身。
值得注意的一个重要区别是,虽然VB.NET的if
函数同时评估了true和false表达式,但C#的条件运算符只计算布尔条件选择的表达式(使其表现得更像传统的{{1}}表达式)。如果VB.NET代码依赖于两个被评估的表达式,这可能很重要。
答案 8 :(得分:0)
or.Fields(“Currency”)。Value =“USD”? 100:0