在Visual Basic中,使用IIf
函数而不是If
语句时是否存在性能差异?
答案 0 :(得分:139)
VB有以下If
语句,我想这个问题:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
第一个基本上是C#的三元条件运算符,第二个是它的coalesce运算符(返回result
,除非它是Nothing
,在这种情况下返回"Alternative"
)。 If
已取代IIf
,后者已过时。
与C#一样,VB的条件If
运算符短路,因此您现在可以安全地编写以下内容,这是使用IIf
函数无法实现的:
Dim len = If(text Is Nothing, 0, text.Length)
答案 1 :(得分:64)
IIf()
运行true和false代码。对于像数字赋值这样的简单事情,这不是什么大问题。但是对于需要任何处理的代码,你会浪费周期运行不匹配的条件,并可能导致副作用。
代码插图:
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!
答案 2 :(得分:13)
另外,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
答案 3 :(得分:7)
更好地使用If而不是IIf来正确使用类型推断机制(Option Infer On)
在此示例中,当我使用If:
时,关键字被识别为字符串Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
否则,它被识别为对象:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
答案 4 :(得分:6)
根据this guy,IIf可以占用If / Then的6倍。 YMMV。
答案 5 :(得分:6)
最重要的是,在这种情况下,可读性应该比性能更优先。即使IIF更高效,但它对目标受众来说可读性更低(我假设如果你在Visual Basic中工作,你希望其他程序员能够轻松地阅读你的代码,这是VB最大的恩惠......和在我看来,这与IIF这样的概念一起丢失了。
另外,"IIF is a function, versus IF being part of the languages' syntax" ......这对我来说意味着,确实,If会更快......如果只是因为if语句可以直接归结为一小组操作码而不是必须到内存中的另一个空间来执行在所述函数中找到的逻辑。这可能是一个陈腐的差异,但值得注意。
答案 6 :(得分:6)
我认为If和IIf之间的主要区别是:
if(test [boolean],statement1,statement2) 这意味着根据测试值,将执行satement1或statement2 (只会执行一个陈述)
Dim obj = IIF(test [boolean],statement1,statement2) 这意味着两个语句都将执行,但根据测试值,其中一个将返回一个值(obj)。
所以如果其中一个语句会抛出一个异常,它会抛出它(IIf)但是在(If)中它会抛出它以防条件返回它的值。
答案 7 :(得分:5)
...至于为什么它可能需要长达6倍,而不是wiki:
因为IIf是一个库函数,所以 总是需要一个开销 函数调用,而有条件的 运营商更有可能生产 内联代码。
本质上,IIf相当于C ++ / C#中的三元运算符,所以如果您愿意,它会为您提供一些很好的1行if / else类型语句。你也可以给它一个评估你是否愿意的功能。
答案 8 :(得分:1)
这些功能不同!也许你只需要使用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仅为“是”。我知道这个计数器是无用的,但有时你需要运行两个函数,如果IF是真或假则无关紧要,只需将其中一个值赋给你的变量。