Passa ai contenuti principali

VB.NET: If vs IIf

In questo post vorrei porre l’attenzione su due costrutti per eseguire istruzioni “if” inline, ed in particolare If e IIf.

If è un operatore del linguaggio che accetta due o tre argomenti mentre IIf è un metodo di una classe particolare che può essere utilizzato anche senza specificare quest’ultima come se fosse una parola chiave del linguaggio.

L’operatore If permette di eseguire un if inline potendo scegliere due modalità di chiamata:

  • If(<condizione>, <valore1>, <valore2>) : se la condizione è vera viene restituito <valore1>, altrimenti <valore2>.
    <valore1> e <valore2> possono essere oggetti, chiamate a metodo o, addirittura funzioni inline o lamdba expression. Quando l’If viene utilizzato in questa modalità, viene valutata la condizione e, in caso di condizione vera viene restituito il secondo argomento senza valutare il terzo. In caso di condizione falsa, viene restituito (valutandolo) il terzo argomento;
  • If(<valore1>, <valore2>): in questo caso, <valore1> deve essere un oggetto a riferimento o un nullable (non sono ammessi, quindi interi, double, strutture, etc., etc.). L’operatore restituisce <valore1> se questo non è Nothing, altrimenti restituisce <valore2>. In sostanza è equivalente alla If(<valore1> isnot nothing, <valore1>,<valore2>).

IIf, nonostante appaia come una parola chiave del linguaggio, è, invece, è un metodo statico della classe Interaction (contenuta nel namespace Microsoft.VisualBasic).

Quando utilizziamo IIf nel nostro codice, non siamo costretti a scrivere la sintassi Interaction.IIf ma è il compilatore che si occupa di sostituire tale sintassi al momento della compilazione.

Per verificare quanto detto, scriviamo la semplice classe:

  1. Public Class [MyClass]
  2.     Public Function IIfMethod(ByVal str As String) As String
  3.         Return CStr(IIf(String.IsNullOrEmpty(str), _
  4.                         "vuota", _
  5.                         str))
  6.     End Function
  7.     Public Function IfMethod(ByVal str As String) As String
  8.         Return If(String.IsNullOrEmpty(str), _
  9.                   "vuota", _
  10.                   str)
  11.     End Function
  12. End Class

Se compiliamo il codice e lo analizziamo utilizzando Reflector, otteniamo:

Codice generato da Visual Studio
Il codice disassemblato con Reflector ci mostra, appunto, che IIf si traduce nella chiamata al metodo IIf di Interaction.

Osserviamo, inoltre che IIf restituisce un object e che siamo, quindi, costretti ad effettuare una conversione di tipo per poterlo ricondurre al tipo che ci interessa.

IIf, a differenza della If, ha sempre tre argomenti e, si comporta come la If a tre argomenti eccetto per il fatto che il secondo e terzo argomento vengono sempre valutati (sono argomenti della chiamata ad un metodo di una classe e, in quanto tali, vengono comunque valutati). Questo comporta che se abbiamo il seguente codice:

  1. Dim tmpObj As String = Nothing
  2. Dim tmpRes = IIf(tmpObj Is Nothing, _
  3.                  "Vuota", _
  4.                  tmpObj.ToLower())

otteniamo un’eccezione NullReferenceException perché stiamo tentando di richiamare il metodo ToLower() su di un oggetto Nothing.

Altra differenza tra If e IIf è che la If ha la necessità che <valore1> e <valore2> abbiamo un tipo comune. Ad esempio non possiamo avere come <valore1> un Integer e come <valore2> una String ma possiamo avere come <valore1> un Integer  e come <valore2> un double. IIf, invece, accetta anche argomenti di tipo differente restituendo un object. Sta a noi effettuare l’opportuno cast del risultato per poter utilizzare correttamente l’oggetto.

 

Commenti

Post popolari in questo blog

VB for Dummies: La serializzazione – parte 2

Questo post è la continuazione del precedente post sulla serializzazione. In particolare vedremo la serializzazione SOAP e quella JSON.   Serializzazione SOAP La serializzazione SOAP è demandata alla classe SOAPFormatter contenuta nel namespace System.Runtime.Serialization.Formatters.Soap contenuto nella libreria omonima. Il formatter SOAP risale alle primissime versioni del framework e, purtroppo, da un certo punto in poi, pur non essendo stato dichiarato obsoleto, non è stato portato avanti nello sviluppo e non supporta alcuni tipi di dati usatissimi nel mondo .NET quali i generici e i nullable. Per questo motivo, non possiamo serializzare in formato SOAP (utilizzando il SOAPFormatter) la nostra Fattura (vedi post precedente) poichè questa ha una proprietà di tipo List(Of DettagliFattura) (generico).   Serializzazione JSON Il formato di serializzazione JSON (maggiori info qui ) è un formato testuale molto in voga nelle applicazioni AJAX. Si trata di un mod...

Recensione: Windows Runtime via C#

Può sembrare strano che un VB-ista legga un libro su C#, ma come diceva Sun Tzu: “ Se conosci il tuo nemico, conosci te stesso ”. A parte gli scherzi, il libro vale la pena di essere letto a prescindere dal linguaggio .NET con cui si lavora. Oltre  290 pagine dedicate agli aspetti fondamentali dello sviluppo con Windows Runtime per le Windows Store App. I prerequisiti per poter leggere il libro sono la conoscenza di C# e di Visual Studio e gli autori non danno per scontato quasi nulla partendo dai concetti di base quali il type system e i suoi principi (argomento che di solito è saltato a piedi pari da chi si avvicina al mondo WinRT dal framework completo e che, se non compreso, può dare problemi nello sviluppo quotidiano). Tra i concetti che possiamo definire “core”, troviamo anche i capitoli dedicati all’app packaging e al process model, entrambi ben strutturati e chiari. Già solo questi tre capitoli iniziali giustificherebbero, in un certo qual modo, l’acquisto del libro, ...

VB.NET for Dummies: Gli Eventi

Vorrei iniziare con questo post una serie dedicata ad aspetti di VB.NET di base che possono essere utile a coloro che si avvicinano al mondo .NET e che, in genere, non vengono trattati a livello base. La serie di post non ha la pretesa di essere assolutamente esaustivi sugli argomenti che tratterò In questo primo post parleremo degli eventi. Cosa sono e a cosa servono Un evento è la “notifica” dell’accadimento di qualcosa. Quando, ad esempio, premiamo un bottone della finestra di un’applicazione, dietro le quinte, il bottone stesso “notifica” al mondo circostante che qualcuno, in quell’istante, lo ha premuto. Sta, poi, al mondo circostante preoccuparsi di “intercettare” l’evento stesso per gestirlo (tramite un gestore di evento). Attenzione a non confondere la pressione del tasto con la “notifica” della pressione del tasto: l’evento è la “notifica” dell’accadimento, non l’accadimento stesso. Ma a cosa serve tutto ciò? Utilizzare gli eventi è un modo per disaccoppiare ...