IIf
在 Visual Basic 中,使用函数而不是语句时是否存在性能差异If
?
9 回答
我认为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
根据这个家伙的说法,IIf 最多可以占用 If/Then 的 6 倍。YMMV。
更好地使用 If 而不是 IIf 以正确使用类型推断机制(Option Infer On)
在此示例中,当我使用 If 时,关键字被识别为字符串:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
否则,它被识别为 Object :
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
最重要的是,在这种情况下,可读性可能比性能更受青睐。即使 IIF 更高效,它对目标受众的可读性也很差(我假设如果您使用 Visual Basic 工作,您希望其他程序员能够轻松阅读您的代码,这是 VB 最大的好处......在我看来,像 IIF 这样的概念会丢失)。
此外,“IIF 是一个函数,而 IF 是语言语法的一部分” ......这对我来说意味着,事实上,If 会更快......如果没有别的,If 语句可以直接归结为到一小组操作码,而不必去内存中的另一个空间来执行在所述函数中找到的逻辑。也许这是一个陈腐的区别,但值得注意。
我认为 If 和 IIf 之间的主要区别是:
if(test [boolean], statement1, statement2) 表示根据测试值执行statement1或statement2(只执行一条语句)
Dim obj = IIF(test [boolean] , statement1, statement2) 这意味着两个语句都将执行,但根据测试值,其中一个将返回一个值给(obj)。
因此,如果其中一个语句将抛出异常,它无论如何都会将其抛出 (IIf) 但在 (If) 中它会抛出它,以防万一条件返回其值。
...至于为什么它可能需要长达 6 倍的时间,引用 wiki:
因为 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 是真还是假,只需将其中一个的值分配给你的变量。