在 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() 运行 true 和 false 代码。对于像数字赋值这样的简单事情,这并不是什么大问题。但对于需要任何类型处理的代码,您会浪费周期运行不匹配的条件,并可能导致副作用。

代码说明:

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 时,Keywords 被识别为字符串:

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

否则,它被识别为一个 Object :

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

根据 这家伙, IIf 的时间最多是 If/Then 的 6 倍。YMMV。

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

还, “IIF 是一个函数,而 IF 是语言语法的一部分”...这对我来说确实意味着如果会更快......if 没有别的原因,If 语句可以直接归结为一小组操作码,而不必转到内存中的另一个空间来执行所述函数中的逻辑。也许这是一个陈词滥调的差异,但值得注意。

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

  • 如果(test [boolean],statement1,statement2)意味着根据测试值SATEMENT1或STACTER2将执行(只有一个语句将执行)

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

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

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

由于IIF是库函数,因此它将始终需要函数调用的开销,而条件运营商更有可能生成内联代码。

本质上,IIf 相当于 C++/C# 中的三元运算符,因此如果您愿意,它可以为您提供一些不错的 1 行 if/else 类型语句。如果您愿意,您还可以为其提供一个评估功能。

这些功能不一样!也许你只需要使用 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 是 true 还是 false,只需将其中一个函数的值分配给你的变量即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top