Versione breve
In che modo la funzione IF()
fa sì che le espressioni passate NON vengano valutate prima di essere passate come parametri?
Versione dettagliata
Faccio parte di un comitato per gli standard e ho avviato una discussione che, in generale, sta cercando di vietare l'uso della funzione IIF()
. Il consenso generale è che se si desidera eseguire un breve incarico IF()
va bene. E se per qualche ragione vuoi valutare due espressioni, non provare a realizzare tutto ciò su una riga, valuta in modo esplicito e mirato le espressioni su linee separate, quindi fai una chiamata IF()
con restituisce i parametri If True
e If Else
.
Sto affermando che prima che un Function(param1, expression)
venga inserito, qualsiasi espressione viene valutata. Quindi, il loro valore valutato viene passato come parametro.
Affermato, questo ha senso:
Sub Main()
Dim intTest As Integer = 0
Dim blnResult As Boolean = IIf(2 = 2, Integer.TryParse("3", intTest), Integer.TryParse("4", intTest))
'intTest = 4
End Sub
- Come previsto,
blnResult
èTrue
. - Poiché il condizionale della funzione
IIF()
èTrue
, il valore dell'espressione nel parametro"If True"
è il compito risultante. - Ma ENTRAMBI le espressioni
If True
ANDIf Else
sono state valutate (in ordine scritto) prima di passare anche alIIF()
funzione, quindiintTest
è diventato4
. - Per quanto mi riguarda, ciò è programmaticamente previsto, ma non i risultati desiderati.
Sul retro della moneta, abbiamo questo:
Sub Main()
Dim intTest As Integer = 0
Dim blnResult As Boolean = If(2 = 2, Integer.TryParse("3", intTest), Integer.TryParse("4", intTest))
'intTest = 3
End Sub
Come l'inverso del problema precedente, ora abbiamo:
- Come previsto,
blnResult
è True. - Poiché il condizionale della funzione
IF()
èTrue
, il valore dell'espressione nel parametro"If True"
è il compito risultante. - Ma SOLO viene valutato il
If True
(in questo caso), quindiintTest
diventa3
. - Per quanto mi riguarda, questo è il risultato desiderato, ma non previsto in modo programmatico.
Mi piacerebbe vedere una funzione personalizzata che faccia la stessa cosa di IF()
.