Domanda

In Visual Basic, c'è una differenza di prestazioni quando si utilizza il IIf invece la funzione If dichiarazione?

È stato utile?

Soluzione

VB è il seguente If dichiarazione che la domanda si riferisce, credo che:

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

Il primo è fondamentalmente C#'s operatore condizionale ternario e il secondo è il suo fondersi operatore (ritorno result a meno che non Nothing, in caso di ritorno "Alternative"). If ha così sostituito IIf e quest'ultimo è obsoleti.

Come in C#, VB condizionale If operatore di corto-circuiti, quindi si può tranquillamente scrivere il seguito, che non è possibile usare IIf funzione:

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

Altri suggerimenti

IIf() funziona sia il vero e il falso codice.Per le cose semplici, come quelli numerici di assegnazione, questo non è un grosso problema.Ma per il codice richiede qualsiasi tipo di lavorazione, stai sprecando i cicli di esecuzione condizione che non corrisponde, e possibilmente causare effetti collaterali.

Codice illustrazione:

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

Uscite:

Foo!
Bar!

Inoltre, un altro grosso problema con la IIf è che effettivamente chiamata a funzioni che sono in argomenti [1], in modo che se una situazione come la seguente:

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

Effettivamente lanciare un'eccezione, che non è come la maggior parte della gente pensa la funzione funziona la prima volta che lo vedono.Questo può anche portare a molto duro per risolvere i bug di un'applicazione.

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

Utilizzare meglio Se invece di IIf utilizzare il tipo di inferenza meccanismo correttamente (Option Infer)

In questo esempio, le parole chiave, è riconosciuta come una stringa quando uso Se :

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

In caso contrario, è riconosciuto come Oggetto :

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

Secondo questo ragazzo, IIf può richiedere fino a 6x, come lungo come Se/Allora.YMMV.

In cima a quello, la leggibilità, probabilmente, dovrebbe essere più altamente preferito di prestazioni in questo caso.Anche se IIF era più efficiente, è semplicemente meno leggibile per il target di riferimento (presumo che se si sta lavorando in Visual Basic, si desidera che altri programmatori per essere in grado di leggere il codice facilmente, VB grande vantaggio...e che è andata persa con concetti come IIF a mio parere).

Inoltre, "IIF è una funzione, e SE essere parte delle lingue "sintassi"...il che implica, per me, che, anzi, Se sarebbe più veloce...se per altro non è che che Se la dichiarazione può essere bollito giù direttamente a un piccolo set di istruzioni, piuttosto che dover andare in un altro spazio in memoria per eseguire la logica in tale funzione.Si tratta di un banale differenza, forse, ma vale la pena notare.

Credo che la differenza principale tra Se e IIf è:

  • Se(test [boolean], statement1, statement2) significa che, secondo il valore di prova sia satement1 o statement2 verrà eseguito (una sola istruzione execute)

  • Dim obj = IIF(test [boolean] , statement1, statement2) significa che entrambe le affermazioni eseguirà ma secondo valore di prova uno di loro verrà restituito un valore (obj).

quindi, se una delle dichiarazioni genererà un'eccezione rimette in (IIf) in ogni caso, ma (Se) sarà gettarlo nel caso in cui la condizione di restituire il suo valore.

...perché può richiedere fino a 6x, disse la wiki:

Perché Se è una funzione di libreria, si sempre richiedono l'overhead di un chiamata di funzione, mentre un condizionale l'operatore ha più probabilità di produrre codice inline.

Essenzialmente IIf è l'equivalente di un operatore ternario in C++/C#, in modo che ti dà un bel 1 riga if/else istruzioni di tipo se ti va.Si può anche dare una funzione per valutare se il desiderio.

Tali funzioni sono diverse!Forse hai solo bisogno di utilizzare istruzione IF.IIF sarà sempre più lento, perché le due funzioni in più non farà standard in CASO di dichiarazione.

Se vi state chiedendo perché c'è la funzione IIF, forse questa sarà la spiegazione:

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

Così il contatore 2 dopo questo, ma la volontà di essere "SÌ".So che questo contatore è roba inutile, ma a volte ci sono funzioni che è necessario sia per l'esecuzione, non importa se è vero o falso, e basta assegnare un valore da uno di loro al variabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top