Question

Dans Visual Basic, existe-t-il une différence de performances lors de l'utilisation de IIf fonction au lieu du If déclaration?

Était-ce utile?

La solution

VB a ce qui suit If déclaration à laquelle la question fait référence, je pense:

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

Le premier est essentiellement l’opérateur conditionnel ternaire de C# et le second est son opérateur de fusion (retour result à moins que ce soit Nothing, auquel cas retourner "Alternative"). If a ainsi remplacé IIf et ce dernier est obsolète.

Comme en C#, le conditionnel de VB If court-circuits de l'opérateur, vous pouvez donc maintenant écrire en toute sécurité ce qui suit, ce qui n'est pas possible en utilisant le IIf fonction:

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

Autres conseils

IIf() exécute à la fois le code vrai et faux.Pour des choses simples comme l’affectation numérique, ce n’est pas grave.Mais pour le code qui nécessite tout type de traitement, vous perdez des cycles en exécutant la condition qui ne correspond pas, ce qui peut provoquer des effets secondaires.

Illustration des codes :

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

Les sorties:

Foo!
Bar!

De plus, un autre gros problème avec IIf est qu'il appellera en fait toutes les fonctions qui se trouvent dans les arguments [1], donc si vous vous trouvez dans une situation comme celle-ci :

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

En fait, cela lèvera une exception, ce qui n'est pas la façon dont la plupart des gens pensent que la fonction fonctionne la première fois qu'ils la voient.Cela peut également conduire à des bogues très difficiles à corriger dans une application.

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

Mieux vaut utiliser If au lieu de IIf pour utiliser correctement le mécanisme d'inférence de type (Option Infer On)

Dans cet exemple, Keywords est reconnu comme une chaîne lorsque j'utilise If :

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

Sinon, il est reconnu comme un Objet :

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

Selon ce mec, IIf peut prendre jusqu'à 6 fois plus de temps que If/Then.YMMV.

En plus de cela, la lisibilité devrait probablement être préférée aux performances dans ce cas.Même si IIF était plus efficace, il est tout simplement moins lisible pour le public cible (je suppose que si vous travaillez en Visual Basic, vous voulez que d'autres programmeurs puissent lire votre code facilement, ce qui est le plus grand avantage de VB...et qui se perd avec des concepts comme IIF à mon avis).

Aussi, "IIF est une fonction, alors que IF fait partie de la syntaxe des langages"...ce qui m'implique que, effectivement, If serait plus rapide...if pour rien d'autre que cela, l'instruction If peut être réduite directement à un petit ensemble d'opcodes plutôt que d'avoir à aller dans un autre espace en mémoire pour exécuter la logique trouvée dans ladite fonction.C'est peut-être une différence banale, mais qui mérite d'être notée.

Je crois que la principale différence entre If et IIf est :

  • Si(test [booléen], instruction1, instruction2) Cela signifie qu’en fonction de la valeur de test, satement1 ou statement2 seront exécutés (une seule instruction s’exécutera)

  • Dim obj = IIF(test [booléen] , instruction1, instruction2) Cela signifie que les deux instructions s’exécuteront, mais qu’en fonction de la valeur de test, l’une d’entre elles renverra une valeur à (obj).

donc si l'une des instructions lève une exception, elle la lancera de toute façon dans (IIf), mais dans (If) elle la lancera juste au cas où la condition renverrait sa valeur.

...pourquoi cela peut prendre jusqu'à 6x, dit le wiki :

Comme IIf est une fonction de bibliothèque, il nécessitera toujours la surcharge d’un , alors qu’un appel de fonction conditionnel l’exploitant produira plus de code en ligne.

Essentiellement, IIf est l'équivalent d'un opérateur ternaire en C++/C#, il vous donne donc de belles instructions de type if/else d'une ligne si vous le souhaitez.Vous pouvez également lui donner une fonction à évaluer si vous le désirez.

Ces fonctions sont différentes !Peut-être avez-vous seulement besoin d'utiliser l'instruction IF.IIF sera toujours plus lent, car il exécutera les deux fonctions et exécutera l'instruction IF standard.

Si vous vous demandez pourquoi il existe la fonction IIF, voici peut-être l'explication :

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

Le compteur sera donc 2 après cela, mais s sera uniquement "OUI".Je sais que ce compteur est inutile, mais parfois il y a des fonctions dont vous aurez besoin à la fois pour exécuter, peu importe si IF est vrai ou faux, et attribuez simplement la valeur de l'une d'elles à votre variable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top