在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时,关键字被识别为字符串:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
否则,它被识别为对象:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
根据这个人的说法,IIf可以占用If/Then的6倍.因人而异.
最重要的是,在这种情况下,可读性应该比性能更优选.即使IIF更高效,但它对目标受众来说可读性更低(我假设如果你在Visual Basic中工作,你希望其他程序员能够轻松地阅读你的代码,这是VB最大的恩惠......和在我看来,这与IIF这样的概念有关.
此外,"IIF是一个函数,而IF是语言语法的一部分" ......这对我来说意味着,确实,If会更快......如果只是为了那个,那么If语句可以直接归结为一小部分操作码,而不是必须到内存中的另一个空间来执行在所述函数中找到的逻辑.这可能是一个陈腐的差异,但值得注意.
我相信If和IIf之间的主要区别是:
如果(test [boolean],statement1,statement2)则表示根据测试值执行satement1或statement2(只执行一个语句)
Dim obj = IIF(test [boolean],statement1,statement2)这意味着两个语句都将执行但是根据测试值,其中一个将返回一个值(obj).
因此,如果其中一个语句将抛出异常,它将抛出(IIf),但在(If)中它将抛出它以防条件将返回其值.
...至于为什么它可能需要长达6倍,quiki维基:
因为IIf是一个库函数,它总是需要函数调用的开销,而条件运算符更可能产生内联代码.
基本上IIf相当于C++/C#中的三元运算符,所以如果你愿意,它会给你一些很好的1行if/else类型语句.你也可以给它一个功能来评估你是否愿意.