vb.net 中的三元运算符
在C系语言中,可以通过
可惜
那么VB.NET就真没有三元运算符了吗?
答案当然是否定的!
而且这个答案或许简单到让你惊讶,你只需要将VB6的兼容函数
没错,下面两行代码所能达成的效果是一样的!
这到底是什么原理?既然它们完全相同,又为何要有两个可以进行三元运算的方法呢?
如同我刚才所说的一样,使用
所以上面代码中的
而
因此,如果你需要在VB.NET中进行大量的三元运算,记得一定要将
另外,其实If还有一个用法,如果你传递给它一个可空类型,并且定义一个替代返回值的话,那么它就可以当作一个空类型检测器!
演示代码如下:
答案自然在 .NET 中的可空值类型 这篇文章中!
表达式 ? 返回结果 : 替代方案
来定义一个三元运算符,比如下面的C#代码int a = 3, b = 4;
int x = (a > b) ? a : b;
其中变量x的赋值完全等于if(a > b)
x = a;
else
x = b;
而在VB中则没有这种直观的三元运算符,必须使用IIf(表达式, 返回结果, 替代方案)
来达到相同的目的。可惜
IIf
这个方法是VB6的兼容方法,它只是简单地将三元运算给包装成了一个函数,并且其返回参数必须得是Object
对象,在使用中避免不了装箱、拆箱的过程。那么VB.NET就真没有三元运算符了吗?
答案当然是否定的!
而且这个答案或许简单到让你惊讶,你只需要将VB6的兼容函数
IIf
替换成关键字If
就可以了!没错,下面两行代码所能达成的效果是一样的!
Dim a = 3, b = 4
Dim x1 = IIf(a > b, a, b)
Dim x2 = If(a > b, a, b)
Msgbox(x1 = x2)
你会惊奇地发现,If
作为判断语句,居然也能起到和IIf
完全相同的目的?这到底是什么原理?既然它们完全相同,又为何要有两个可以进行三元运算的方法呢?
如同我刚才所说的一样,使用
IIf
进行三元运算时,所传递与返回的参数都是Object
对象,需要进行拆箱处理。所以上面代码中的
x1
实际上是Object
类型,是由VB.NET在动态运行时进行了拆箱处理,才能与x2进行对比!而
If
所执行的三元运算,是真正意义上的三元运算,它的执行结果与C#的三元运算完全一致,所以变量x2
的类型是Integer
,返回的参数也不需要进行拆箱处理!因此,如果你需要在VB.NET中进行大量的三元运算,记得一定要将
IIf
替换为If
,这会在性能上有些许提升(虽然并不多)。另外,其实If还有一个用法,如果你传递给它一个可空类型,并且定义一个替代返回值的话,那么它就可以当作一个空类型检测器!
演示代码如下:
Dim o1 As Object = Nothing
Dim o2 As Object = If(o1, New Object)
MsgBox(o2 Is Nothing)
在这种情况下,如果If
检测到o1
对象为空,那么它就会返回一个New Object
给o2
,完全等效下面的方法:If o1 IsNot Nothing Then
o2 = o1
Else
o2 = New Object
End If
只不过这个方法仅能对可空类型有效,那么我们该如何让它对值类型有效呢?答案自然在 .NET 中的可空值类型 这篇文章中!
Dim i1 As Integer? = Nothing
Dim i2 As Integer = If(i1, 5)
MsgBox(i2)
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。