Pregunta

En Visual Basic, ¿existe alguna diferencia de rendimiento cuando se utiliza el IIf función en lugar de la If ¿declaración?

¿Fue útil?

Solución

VB tiene lo siguiente If declaración a la que se refiere la pregunta, creo:

' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")

El primero es básicamente el operador condicional ternario de C# y el segundo es su operador fusionado (return result a menos que sea Nothing, en cuyo caso regresar "Alternative"). If ha sustituido así IIf y este último está obsoleto.

Como en C#, el condicional de VB If cortocircuitos del operador, por lo que ahora puede escribir con seguridad lo siguiente, lo cual no es posible usando el IIf función:

Dim len = If(text Is Nothing, 0, text.Length)

Otros consejos

IIf() ejecuta tanto el código verdadero como el falso.Para cosas simples como la asignación numérica, esto no es gran cosa.Pero para el código que requiere algún tipo de procesamiento, está desperdiciando ciclos ejecutando la condición que no coincide y posiblemente causando efectos secundarios.

Ilustración del código:

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

Salidas:

Foo!
Bar!

Además, otro gran problema con IIf es que en realidad llamará a cualquier función que esté en los argumentos [1], por lo que si tiene una situación como la siguiente:

string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)

En realidad, generará una excepción, que no es como la mayoría de la gente cree que funciona la función la primera vez que la ven.Esto también puede provocar algunos errores muy difíciles de corregir en una aplicación.

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

Mejor use If en lugar de IIf para usar el mecanismo de inferencia de tipos correctamente (Opción Infer On)

En este ejemplo, las palabras clave se reconocen como una cadena cuando uso If:

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

De lo contrario, se reconoce como un Objeto:

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

De acuerdo a este chico, IIf puede tardar hasta 6 veces más que If/Then.YMMV.

Además de eso, en este caso probablemente debería preferirse más la legibilidad que el rendimiento.Incluso si IIF fuera más eficiente, simplemente es menos legible para el público objetivo (supongo que si estás trabajando en Visual Basic, querrás que otros programadores puedan leer tu código fácilmente, lo cual es la mayor ventaja de VB...y que en mi opinión se pierde con conceptos como IIF).

También, "IIF es una función, versus IF que es parte de la sintaxis de los idiomas"...lo que me implica que, efectivamente, sería más rápido...aunque solo sea por eso, la declaración If se puede reducir directamente a un pequeño conjunto de códigos de operación en lugar de tener que ir a otro espacio en la memoria para realizar la lógica que se encuentra en dicha función.Quizás sea una diferencia trivial, pero vale la pena señalarla.

Creo que la principal diferencia entre If y IIf es:

  • If (prueba [boolean], declaración1, declaración2) significa que de acuerdo con el valor de prueba, ya sea SATEMENT1 o Declaración 2, se ejecutará (solo se ejecutará una declaración)

  • Dim obj = iif (prueba [boolean], declaración1, declaración2) significa que ambas declaraciones se ejecutarán, pero de acuerdo con el valor de la prueba, uno de ellos devolverá un valor a (obj).

entonces, si una de las declaraciones arroja una excepción, la arrojará en (IIf) de todos modos, pero en (If) la arrojará en caso de que la condición devuelva su valor.

...en cuanto a por qué puede tardar hasta 6 veces, dice la wiki:

Debido a que IIF es una función de biblioteca, siempre requerirá la sobrecarga de una llamada de función, mientras que un operador condicional probablemente producirá código en línea.

Esencialmente, IIf es el equivalente de un operador ternario en C++/C#, por lo que le brinda algunas declaraciones agradables de tipo if/else de 1 línea si así lo desea.También puedes darle una función para evaluar si lo deseas.

¡Esas funciones son diferentes!Quizás solo necesites usar la declaración IF.IIF siempre será más lento, porque realizará ambas funciones y además realizará una declaración IF estándar.

Si se pregunta por qué existe la función IIF, tal vez esta sea la explicación:

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

Entonces el contador será 2 después de esto, pero s será solo "SÍ".Sé que esto del contador es inútil, pero a veces hay funciones que necesitarás ejecutar ambas, no importa si IF es verdadero o falso, y simplemente asigna el valor de una de ellas a tu variable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top