In Visual Basic, c'è una differenza di prestazioni quando si utilizza la IIf
funzione invece If
dell'istruzione?
In Visual Basic, c'è una differenza di prestazioni quando si utilizza la IIf
funzione invece If
dell'istruzione?
Risposte:
VB ha la seguente If
dichiarazione a cui si riferisce la domanda, penso:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Il primo è fondamentalmente l'operatore condizionale ternario di C # e il secondo è il suo operatore di coalesce (return a result
meno che non lo sia Nothing
, nel qual caso return "Alternative"
). If
è così sostituito IIf
e quest'ultimo è obsoleto.
Come in C #, l' If
operatore condizionale di VB va in cortocircuito, quindi ora puoi scrivere in sicurezza quanto segue, cosa non possibile utilizzando la IIf
funzione:
Dim len = If(text Is Nothing, 0, text.Length)
If
è IIf
di gran lunga più efficiente della funzione.
That's all you need to know, really
non sembra un atteggiamento favorevole per un sito web dedicato alla condivisione della conoscenza;)
IIf()
esegue sia il codice vero che quello falso. Per cose semplici come l'assegnazione numerica, questo non è un grosso problema. Ma per il codice che richiede qualsiasi tipo di elaborazione, stai sprecando cicli che eseguono la condizione che non corrisponde e che potrebbero causare effetti collaterali.
Illustrazione del codice:
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 IIf è che in realtà chiamerà tutte le funzioni che sono negli argomenti [1], quindi se hai una situazione come la seguente:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
In realtà genererà un'eccezione, che non è il modo in cui la maggior parte delle persone pensa che la funzione funzioni la prima volta che la vedono. Questo può anche portare ad alcuni bug molto difficili da correggere in un'applicazione.
[1] Funzione IIf - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Meglio usare If invece di IIf per usare correttamente il meccanismo di inferenza del tipo (Option Infer On)
In questo esempio, le parole chiave vengono riconosciute come una stringa quando utilizzo If:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Altrimenti, viene riconosciuto come Oggetto:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Secondo questo ragazzo , IIf può richiedere fino a 6 volte il tempo di If / Then. YMMV.
Inoltre, in questo caso, la leggibilità dovrebbe essere probabilmente maggiormente preferita rispetto alle prestazioni. Anche se IIF fosse più efficiente, è semplicemente meno leggibile per il pubblico di destinazione (presumo che se stai lavorando in Visual Basic, vuoi che altri programmatori siano in grado di leggere facilmente il tuo codice, che è il più grande vantaggio di VB ... e che si perde con concetti come IIF secondo me).
Inoltre, "IIF è una funzione, contro IF fa parte della sintassi dei linguaggi" ... il che implica per me che, in effetti, If sarebbe più veloce ... se non altro l'istruzione If può essere ridotta direttamente a un piccolo insieme di codici operativi piuttosto che dover andare in un altro spazio della memoria per eseguire la logica trovata in detta funzione. È una differenza banale, forse, ma vale la pena notare.
Credo che la principale differenza tra If e IIf sia:
If (test [boolean], statement1, statement2) significa che in base al valore del test verranno eseguiti satement1 o statement2 (verrà eseguita solo un'istruzione)
Dim obj = IIF (test [boolean], statement1, statement2) significa che entrambe le istruzioni verranno eseguite ma in base al valore di test una di esse restituirà un valore a (obj).
quindi, se una delle istruzioni genera un'eccezione, la lancia comunque in (IIf) ma in (If) la lancia nel caso in cui la condizione restituisca il suo valore.
... sul motivo per cui può richiedere fino a 6x, afferma il wiki:
Poiché IIf è una funzione di libreria, richiederà sempre l'overhead di una chiamata di funzione, mentre un operatore condizionale produrrà molto probabilmente codice inline.
Essenzialmente IIf è l'equivalente di un operatore ternario in C ++ / C #, quindi ti dà alcune belle istruzioni di tipo if / else di 1 riga se lo desideri. Puoi anche dargli una funzione da valutare se lo desideri.
Queste funzioni sono diverse! Forse hai solo bisogno di usare l'istruzione IF. IIF sarà sempre più lento, perché eseguirà entrambe le funzioni più l'istruzione IF standard.
Se ti stai chiedendo perché esiste la funzione IIF, forse questa sarà una 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
Quindi il contatore sarà 2 dopo questo, ma solo "SÌ". So che questa roba del contatore è inutile, ma a volte ci sono funzioni che dovrai eseguire entrambe, non importa se IF è vero o falso, e assegna semplicemente il valore da uno di loro alla tua variabile.
IIf()
in questo modo confonderà le persone che leggono il tuo codice.
IIf
.