在Visual Basic中,使用IIf
函数是否比使用If
语句具有更好的性能?
我认为问题中提到的是VB中以下的If
语句:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
第一个是基本上与C#的三元条件运算符相同,而第二个是它的合并运算符(返回 result
除非它是 Nothing
,此时返回 "Alternative"
)。因此,If
取代了 IIf
,后者已经过时。
就像在 C# 中一样,VB 的条件 If
运算符也支持短路处理,因此您现在可以安全地编写以下代码,而使用 IIf
函数则不可能实现:
Dim len = If(text Is Nothing, 0, text.Length)
IIf()
同时运行真和假的代码。对于像数值赋值这样简单的事情来说,这并不是什么大问题。但对于需要任何处理的代码来说,你会浪费运行不匹配条件的周期,并可能导致副作用。
示例代码:
Module Module1
Sub Main()
Dim test As Boolean = False
Dim result As String = IIf(test, Foo(), Bar())
End Sub
Public Function Foo() As String
Console.WriteLine("Foo!")
Return "Foo"
End Function
Public Function Bar() As String
Console.WriteLine("Bar!")
Return "Bar"
End Function
End Module
输出:
Foo!
Bar!
另外,IIf语句还存在一个重大问题,即它会实际调用任何在参数[1]中的函数。因此,如果您遇到以下情况:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
实际上,该函数会抛出异常,这并不是大多数人第一次看到它时的想法。这也可能导致应用程序中一些非常难以修复的错误。
[1] IIf 函数 - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
更好的做法是使用 If 而不是 IIf,以正确使用类型推断机制(Option Infer On)
在这个例子中,当我使用 If 时,Keywords 被识别为字符串:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
根据这位的说法,使用IIf可能需要比If/Then多6倍的时间。结果因人而异。
If(test [boolean], statement1, statement2) 它意味着根据测试值,将执行语句1或语句2(只有一个语句会被执行)
Dim obj = IIF(test [boolean] , statement1, statement2) 它意味着两个语句都将执行,但根据测试值,其中之一将返回一个值给(obj)。
因此,如果其中一个语句引发异常,它将在(IIf)中抛出,但在(If)中仅在条件返回其值的情况下才会抛出异常。
关于为什么IIf函数的执行速度可能会慢至6倍,维基百科如是说:
因为IIf是一个库函数,它总是需要函数调用的开销,而条件运算符更有可能产生内联代码。
实际上,IIf函数相当于C++/C#中的三元运算符,因此如果您愿意,它可以给您提供一些漂亮的1行if/else类型语句。您还可以给它一个要评估的函数。
这些函数是不同的!也许你只需要使用IF语句。
IIF会更慢,因为它会执行两个函数,还要执行标准的IF语句。
如果你想知道为什么有IIF函数,也许这就是解释:
Sub main()
counter = 0
bln = True
s = iif(bln, f1, f2)
End Sub
Function f1 As String
counter = counter + 1
Return "YES"
End Function
Function f2 As String
counter = counter + 1
Return "NO"
End Function
因此,在此之后,计数器将为2,但s仅为“YES”。我知道这个计数器的东西是无用的,但有时候有些函数需要同时运行,无论IF是true还是false,只需从其中一个分配值给您的变量。
IIf()
只会让阅读你代码的人感到困惑。 - Spivonious
IIf
的副作用。 - jorIf
比IIf
函数要高效得多。 - Konrad Rudolph