101

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

4

9 回答 9

141

我认为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)
于 2008-08-26T15:51:53.013 回答
67

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!
于 2008-08-26T15:40:29.703 回答
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

于 2008-08-26T15:43:59.490 回答
7

根据这个家伙的说法,IIf 最多可以占用 If/Then 的 6 倍。YMMV。

于 2008-08-26T15:31:08.210 回答
7

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

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

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

否则,它被识别为 Object :

Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
于 2009-09-22T12:45:28.147 回答
6

最重要的是,在这种情况下,可读性可能比性能更受青睐。即使 IIF 更高效,它对目标受众的可读性也很差(我假设如果您使用 Visual Basic 工作,您希望其他程序员能够轻松阅读您的代码,这是 VB 最大的好处......在我看来,像 IIF 这样的概念会丢失)。

此外,“IIF 是一个函数,而 IF 是语言语法的一部分” ......这对我来说意味着,事实上,If 会更快......如果没有别的,If 语句可以直接归结为到一小组操作码,而不必去内存中的另一个空间来执行在所述函数中找到的逻辑。也许这是一个陈腐的区别,但值得注意。

于 2008-08-26T15:37:33.750 回答
6

我认为 If 和 IIf 之间的主要区别是:

  • if(test [boolean], statement1, statement2) 表示根据测试值执行statement1或statement2(只执行一条语句)

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

因此,如果其中一个语句将抛出异常,它无论如何都会将其抛出 (IIf) 但在 (If) 中它会抛出它,以防万一条件返回其值。

于 2009-12-21T14:28:56.067 回答
5

...至于为什么它可能需要长达 6 倍的时间,引用 wiki:

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

本质上 IIf 相当于 C++/C# 中的三元运算符,因此如果您愿意,它会为您提供一些不错的 1 行 if/else 类型语句。你也可以给它一个函数来评估你是否愿意。

于 2008-08-26T15:34:48.233 回答
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 只会是“YES”。我知道这个计数器的东西是没用的,但有时有些函数你需要同时运行,不管 IF 是真还是假,只需将其中一个的值分配给你的变量。

于 2015-03-16T19:54:19.487 回答