在Visual Basic中,使用IIf
函数而不是If
语句时在性能上有区别吗?
在Visual Basic中,使用IIf
函数而不是If
语句时在性能上有区别吗?
Answers:
If
我认为,VB有以下提到该问题的陈述:
' 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)
If
比该IIf
函数更有效。
That's all you need to know, really
对于专门用于知识共享的网站,这听起来似乎不太有利;)
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/zh-cn/library/27ydhh0d( VS.71) .aspx
最重要的是,在这种情况下,可读性可能比性能更受重视。即使IIF效率更高,目标读者也很难理解(我假设如果您使用的是Visual Basic,您希望其他程序员能够轻松地阅读您的代码,这是VB的最大福音。在我看来,这些东西已经被诸如IIF之类的概念所迷失了。
同样,“ IIF是一个函数,而IF是语言语法的一部分” ……对我而言,这确实意味着,If会更快……If除此之外,If语句可以直接分解为到一小部分操作码,而不必去存储器中的另一个空间来执行所述功能中发现的逻辑。也许这是个古朴的区别,但值得注意。
这些功能是不同的!也许您只需要使用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()
以这种方式使用只会使人们在阅读您的代码时感到困惑。
IIf
。