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

Bry*_*oth 97 vb.net iif-function if-statement

在Visual Basic中,使用IIf函数而不是If语句时是否存在性能差异?

Kon*_*lph 140

VB有以下If陈述,问题所指,我认为:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Run Code Online (Sandbox Code Playgroud)

第一个基本上是C#的三元条件运算符,第二个是它的合并运算符(result除非它返回Nothing,在这种情况下返回"Alternative").If因此取而代之IIf,后者已经过时了.

就像在C#中,VB的条件If运算符短路一样,所以你现在可以安全地编写以下内容,这是使用IIf函数无法实现的:

Dim len = If(text Is Nothing, 0, text.Length)
Run Code Online (Sandbox Code Playgroud)

  • 我的上帝,编辑评论完全没用.一位匿名编辑建议编辑,后来被三位评论者拒绝了,即使它*纠正了我的代码中的错误.如果你读过这篇文章,那么你就是这些评论者:你应该心疼! (19认同)
  • 您没有回答性能问题,也没有提到“IIf”的副作用。 (3认同)
  • @jor我的答案的最后一段是关于副作用.当其中一个选项过时时,性能并不真正相关.对于它的价值,原生运算符`If`到目前为止比`IIf`函数更有效. (2认同)
  • @mmcrae这是正确的和有目的的:正如我所说,IIf已经过时了,所以讨论它没什么意义.也就是说,我的最后一段确实讨论了相关的区别.这就是你需要知道的,真的. (2认同)
  • 非常感谢您希望支持良好的标准并确保新手不会采取不良做法,但是有人可能会遇到一个完全合法的问题,这使他们希望更好地理解它们之间的区别……例如维护遗留代码,还有其他一些使用它的工具,等等。而“这就是您真正需要的全部信息”,听起来并不像是一个致力于知识共享的网站的有益态度;) (2认同)

Tom*_*eld 64

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
Run Code Online (Sandbox Code Playgroud)

输出:

Foo!
Bar!
Run Code Online (Sandbox Code Playgroud)


rjz*_*zii 13

另外,IIf的另一个大问题是它实际上会调用参数[1]中的任何函数,所以如果你遇到如下情况:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Run Code Online (Sandbox Code Playgroud)

它实际上会抛出异常,这并不是大多数人认为函数第一次看到它时的工作方式.这也可能导致一些非常难以修复应用程序中的错误.

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


Lar*_*rry 7

更好地使用If而不是IIf正确使用类型推断机制(Option Infer On)

在此示例中,当我使用If时,关键字被识别为字符串:

Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Run Code Online (Sandbox Code Playgroud)

否则,它被识别为对象:

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Run Code Online (Sandbox Code Playgroud)


Gre*_*man 6

根据这个人的说法,IIf可以占用If/Then的6倍.因人而异.


Edg*_*ona 6

最重要的是,在这种情况下,可读性应该比性能更优选.即使IIF更高效,但它对目标受众来说可读性更低(我假设如果你在Visual Basic中工作,你希望其他程序员能够轻松地阅读你的代码,这是VB最大的恩惠......和在我看来,这与IIF这样的概念有关.

此外,"IIF是一个函数,而IF是语言语法的一部分" ......这对我来说意味着,确实,If会更快......如果只是为了那个,那么If语句可以直接归结为一小部分操作码,而不是必须到内存中的另一个空间来执行在所述函数中找到的逻辑.这可能是一个陈腐的差异,但值得注意.


小智 6

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

  • 如果(test [boolean],statement1,statement2)则表示根据测试值执行satement1或statement2(只执行一个语句)

  • Dim obj = IIF(test [boolean],statement1,statement2)这意味着两个语句都将执行但是根据测试值,其中一个将返回一个值(obj).

因此,如果其中一个语句将抛出异常,它将抛出(IIf),但在(If)中它将抛出它以防条件将返回其值.


Dil*_*e-O 5

...至于为什么它可能需要长达6倍,quiki维基:

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

基本上IIf相当于C++/C#中的三元运算符,所以如果你愿意,它会给你一些很好的1行if/else类型语句.你也可以给它一个功能来评估你是否愿意.