当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《IIf()和If之间的性能差异》经验,为你挑选了8个好方法。

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



1> Konrad Rudol..:

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)


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

2> Tom Mayfield..:

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!



3> rjzii..:

另外,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



4> Larry..:

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

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

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

否则,它被识别为对象:

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



5> Greg Hurlman..:

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



6> EdgarVerona..:

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

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



7> 小智..:

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

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

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

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



8> Dillie-O..:

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

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

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

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有