在C系语言中,可以通过 表达式 ? 返回结果 : 替代方案 来定义一个三元运算符,比如下面的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 Objecto2,完全等效下面的方法:
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)