Credo che ogni programmatore VB bi-partizan (ossia quelli avvezzi anche ai linguaggi C-like) abbia prima o poi sentito la mancanza dell'operatore ternario. Giusto per capirci, di quel "robo" che permette di scrivere codice del tipo:
int y = a>b ? 1 : 2;
E vedere assegnati alla variabile y i valori 1 o 2 rispettivamente in caso di verità o falsità della espressione (a>b); ebbene, io lo trovo molto comodo, soprattutto quando si riesce a non esagerare con la complessità delle espressioni in gioco (altrimenti il codice risulterà illeggibile anche all'autore dopo poco tempo). La domanda che nasce spontanea è: ma non puoi usare (in VB), la funzione IIf? Certo, e lo farei se... fosse tipizzata. Il "problema" consiste nel fatto che IIf definisce di tipo object il proprio valore di ritorno, rendendo quindi spesso obbligatorio l'(ab)uso del cast:
Dim i As Integer = DirectCast(IIf(a>b, 1, 2), Integer)
In poche parole, mi ritrovo con codice più pesante sia da leggere sia da gestire (di fatto, quel cast è inutile). Ricorrendo a VB2005 ed ai generics, però, possiamo implementare una soluzione che, per quanto quick'n'dirty, (infatti non mi fa impazzire) mi appare sicuramente più decente di quella built-in (e inoltre permette di fare piazza pulita nel codice pregresso con estrema facilità). Aggiungete un modulo al progetto, e definite come segue la "nuova" funzione IIf:
Function IIf(Of T)(ByVal expression As Boolean, ByVal truepart As T, ByVal falsepart As T) As T
If expression Then
Return truepart
Else
Return falsepart
End If
End Function
E spieghiamo al codice pregresso l'avvenuto cambiamento:
Dim i As Integer = IIf(Of Integer)(a>b, 1, 2)
A me sembra meglio... O no?
P.S.: A nessun namespace Microsoft.VisualBasic è stato fatto del male durante l'eliminazione della funzione IIf :-)
posted @ domenica 29 maggio 2005 15:55