IIf()和If之间的性能差异

在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) 

它实际上会抛出一个exception,这并不是大多数人第一次认为这个函数是第一次看到它。 这也会导致一些很难修复应用程序中的错误。

[1] IIf函数 – http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx

更好的使用如果不是使用IIf来正确使用types推断机制(Option Infer On)

在这个例子中,当我使用If时,关键字被识别为一个string:

 Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords) 

否则,它被认为是一个对象:

 Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords) 

根据这个家伙 ,IIf可以花费6倍,只要If / Then。 因人而异。

最重要的是,在这种情况下,可读性应该比性能更受欢迎。 即使IIF效率更高,对目标受众的可读性也会降低(我假设如果你在Visual Basic中工作,你希望其他程序员能够很容易地读取你的代码,这是VB最大的好处,这在我看来是与IIF的概念丢失)。

另外, “IIF是一个函数,而IF是语言的语法的一部分” ……这意味着,事实上,if会更快……如果没有别的,那么If语句可以直接下来到一小部分操作码而不必去存储器中的另一个空间来执行在所述function中find的逻辑。 这也许是一个陈腐的差异,但值得注意。

我相信If和IIf的主要区别是:

  • 如果(test [boolean],statement1,statement2)意味着根据testing值,satement1或者statement2将被执行(只执行一个语句)

  • Dim obj = IIF(test [boolean],statement1,statement2)这意味着这两个语句将执行,但根据testing值其中之一将返回一个值(OBJ)。

所以如果其中一个语句会抛出一个exception,它将抛出它(IIf),但是在(If)它将抛出它,以防万一条件返回它的值。

至于为什么它可能需要6倍,维基百科:

由于IIf是一个库函数,它总是需要函数调用的开销,而条件运算符则更可能产生内联代码。

本质上,IIf相当于C ++ / C#中的三元运算符,所以如果你愿意的话,它会给你一些很好的if / elsetypes的语句。 你也可以给它一个函数来评估你的愿望。

这些function是不同的! 也许你只需要使用IF语句。 IIF将总是比较慢,因为它将执行两个function,并且会执行标准的IF语句。

如果你想知道为什么有IIFfunction,也许这将是解释:

 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是真或假,并不重要,只要从其中的一个赋值给你的variables。