visualbasic visual sentencia net microsoft ejemplos vb.net if-statement iif-function

vb.net - visual - Diferencia de rendimiento entre IIf() y If



microsoft visualbasic interaction iif (9)

En Visual Basic, ¿existe una diferencia de rendimiento al usar la función IIf lugar de la instrucción If ?


... en cuanto a por qué puede llevar tanto tiempo como 6x, dice la wiki:

Como 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 ofrece algunas buenas frases tipo 1 if / else si lo desea. También puede darle una función para evaluar si lo desea.


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

Además, http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx ... lo que implica para mí que, de hecho, si fuera más rápido ... si no fuera por eso, la sentencia 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. Es una diferencia trivial, tal vez, pero vale la pena señalar.


Además, otro gran problema con el IIf es que realmente 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)

De hecho arrojará una excepción, que no es como la mayoría de las personas piensa que la función funciona la primera vez que la ven. Esto también puede provocar 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


Creo que la principal diferencia entre If y IIf es:

  • If (test [boolean], statement1, statement2) significa que de acuerdo con el valor de prueba se ejecutará satement1 o statement2 (solo se ejecutará una sentencia)

  • Dim obj = IIF (test [boolean], statement1, statement2) significa que ambos enunciados se ejecutarán pero según el valor de prueba uno de ellos devolverá un valor a (obj).

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


De acuerdo con este tipo , IIf puede tomar hasta 6 veces más tiempo que If / Then. YMMV.


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

Si se pregunta por qué hay una 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á "SÍ" solamente. Sé que este contador es inútil, pero a veces hay funciones que necesitará para ejecutar, no importa si IF es verdadero o falso, y simplemente asigne valor de uno de ellos a su variable.


Mejor uso si en lugar de IIf utiliza el mecanismo de inferencia de tipo correctamente (Opción Inferir activado)

En este ejemplo, Palabras clave se reconoce 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)


VB tiene la siguiente declaración If 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 de coalescencia ( result retorno a menos que sea Nothing , en cuyo caso devuelve "Alternative" ). If ha reemplazado así IIf y el último está obsoleto.

Al igual que en C #, el operador condicional de VB cortocircuita el circuito, por lo que ahora puede escribir con seguridad lo siguiente, lo que no es posible con la función IIf :

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


IIf() ejecuta el código verdadero y falso. Para cosas simples como asignación numérica, esto no es gran cosa. Pero para el código que requiere cualquier tipo de procesamiento, está perdiendo ciclos ejecutando la condición que no concuerda, 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

Productos:

Foo! Bar!