Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Il costrutto If

Guida al Visual Basic .NET

Capitolo 7° - Il costrutto If

<< Precedente Prossimo >>

Capita spessissimo di dover eseguire un controllo per verificare se vigono certe condizioni. È possibile attuare tale operazione tramite un costrutto di controllo, la cui forma più comune e diffusa è il costrutto If. Questo permette di controllare se una condizione è vera. Ad esempio: in un programma che calcoli l'area di un quadrato si deve imporre di visualizzare un messaggio di errore nel caso l'utente immetta una misura negativa, poichè, come è noto, non esistono lati la cui misura è un numero negativo:

Module Module1
    Sub Main()
        Dim Lato As Single

        Console.WriteLine("Inserire il lato di un quadrato:")
        Lato = Console.ReadLine

        If Lato < 0 Then 'Se Lato è minore di 0...
            Console.WriteLine("Il lato non può avere una misura negativa!")
        Else 'Altrimenti, se non lo è...
            Console.WriteLine("L'area del quadrato è: " & Lato * Lato)
        End If 'Fine controllo

        Console.ReadKey()
    End Sub
End Module  

Come sicuramente avrete intuito, questo controllo si può associare al costrutto italiano "Se avviene qualcosa Allora fai questo Altrimenti fai quell'altro". Si può eseguire qualsiasi tipo di comparazione tra If e Then utilizzando i seguenti operatori di confronto:

  • > : maggiore
  • < : minore
  • = : uguaglianza
  • <> : diverso
  • >= : maggiore o uguale
  • <= : minore o uguale
  • Is : identicità (solo per tipi reference)
  • IsNot : negazione di Is (solo per tipi reference)

Ma l'importante è ricordarsi di attenersi a questa sintassi:

If [Condizione] Then
  [istruzioni]
Else
  [istruzioni alternative]
End If  


If nidificati

Quando si trova un costrutto If all'interno di un altro costrutto If, si dice che si tratta di un Costrutto If Nidificato. Questo avviene abbastanza spesso, specie se si ha bisogno di fare controlli multipli:

Module Module1
    Sub Main()
        Dim Numero As Int16

        Console.WriteLine("Inserisci un numero:")
        Numero = Console.ReadLine

        If Numero > 0 Then
            If Numero < 5 Then
                Console.WriteLine("Hai indovnato il numero!")
            End If
        Else
            Console.WriteLine("Numero errato!")
        End If

        Console.ReadKey()
    End Sub
End Module  

Se il numero inserito da tastiera è compreso fra 0 e 5, estremi esclusi, allora l'utente ha indovinato il numero, altrimenti no. Si può trovare un numero illimitato di If nidificati, ma è meglio limitarne l'uso e, piuttosto, fare utilizzo di connettivi logici.


I connettivi logici

I connettivi logici sono 4: And, Or, Xor e Not. Servono per costruire controlli complessi. Di seguito un'illustrazione del loro funzionamento:

  • If A And B : la condizione risulta verificata se sia A che B sono vere contemporaneamente
  • If A Or B : la condizione risulta verificata se è vera almeno una delle due condizioni
  • If A Xor B: la condizione risulta vera se una sola delle due condizioni è vera
  • If Not A: la condizione risulta verificata se è falsa

Un esempio pratico:

Module Module1
    Sub Main()
        Dim a, b As Double

        Console.WriteLine("Inserire i lati di un rettangolo:")
        a = Console.ReadLine
        b = Console.ReadLine

        'Se tutti e due i lati sono maggiori di 0
        If a > 0 And b > 0 Then
            Console.WriteLine("L'area è: " & a * b)
        Else
            Console.WriteLine("Non esistono lati con misure negative!")
        End If
    Console.Readkey()
    End Sub
End Module  



Continuare il controllo: ElseIf

Nei precedenti esempi, la seconda parte del costrutto è sempre stata Else, una parola riservata che indica cosa fare se nonsi verifica la condizione proposta dalla prima parte. Il suo valore è, quindi, di pura alternativa. Esiste, tuttavia, una variante di Else che consente di continuare con un altro controllo senza dover ricorrere ad If nidificati (a cui è sempre meglio supplire con qualcosa di più ordinato). Ammettiamo, ad esempio, di avere un codice 'autocritico' simile:

Module Module1
    Sub Main()
        Dim Voto As Single

        Console.WriteLine("Inserisci il tuo voto:")
        Voto = Console.ReadLine

        If Voto < 3 Then
            Console.WriteLine("Sei senza speranze!")
        Else
            If Voto < 5 Then
                Console.WriteLine("Ancora un piccolo sforzo...")
            Else
                If Voto < 7 Then
                    Console.WriteLine("Stai andando discretamente")
                Else
                    If Voto < 9 Then
                        Console.WriteLine("Molto bene, continua così")
                    Else
                        Console.WriteLine("Sei praticamente perfetto!")
                    End If
                End If
            End If
        End If

        Console.ReadKey()
    End Sub
End Module 

E' abbastanza disordinato... La variante ElseIf è molto utile per migliore la leggibilità del codice:

Module Module1
    Sub Main()
        Dim Voto As Single

        Console.WriteLine("Inserisci il tuo voto:")
        Voto = Console.ReadLine

        If Voto < 3 Then
            Console.WriteLine("Sei senza speranze!")
        ElseIf Voto < 5 Then
            Console.WriteLine("Ancora un piccolo sforzo...")
        ElseIf Voto < 7 Then
            Console.WriteLine("Stai andando discretamente")
        ElseIf Voto < 9 Then
            Console.WriteLine("Molto bene, continua così")
        Else
            Console.WriteLine("Sei praticamente perfetto!")
        End If

        Console.ReadKey()
    End Sub
End Module 

Notate che tutti gli ElseIf fanno parte dello stesso costrutto: mentre nell'esempio ogni If nidificato era un blocco a sé stante, dotato infatti di un proprio End If, in questo caso ogni alternativa-selettiva fa comunque parte dell'unico If iniziale, protratto solamente un poco più a lungo.


Blocchi di istruzioni

Fino a questo punto, gli esempi proposti non hanno mai dichiarato una variabile dentro un costrutto If, ma solo all'inizio del programma, dopo Sub Main(). È possibile dichiarare variabili in altri punti del codice che non siano all'inizio della Sub? Certamente sì. A differenza di altri, i linguaggi .NET permettono di dichiarare variabili in qualunque punto del sorgente, dove occorre, evitando un gigantesco agglomerato di dichiarazioni iniziali, fortemente dispersive per chi legge. Questo è un grande vantaggio, ma bisogna fare attenzione ai blocchi di codice. Con questo termine ci si riferisce a parti del sorgente comprese tra due parole riservate, che in VB si solito sono accoppiante in questo modo:

[Keyword]
  'Blocco di codice
End [Keyword] 

Ad esempio, tutto il codice compreso tra Sub ed End Sub costituisce un blocco, così come lo costituisce quello compreso tra If ed End If (se non vi è un Else), tra If ed Else o addirttura tra Module ed End Module. Facendo questa distinzione sarà facile intuire che una variabile dichiarata in un blocco non è visibile al di fuori di esso. Con questo voglio dire che la sua dichiarazione vale solo all'interno di quel blocco. Ecco una dimostrazione:

Module Module1
    Sub Main()
        'a, b e c fanno parte del blocco delimitato da Sub ... End Sub
        Dim a, b, c As Single

        'Semplice esempio di risoluzione di equazione di secondo grado
        Console.WriteLine("Equazione: ax2 + bx + c = 0")
        Console.WriteLine("Inserisci, in ordine, a, b e c:")
        a = Console.ReadLine
        b = Console.ReadLine
        c = Console.ReadLine

        If a = 0 Then
            Console.WriteLine("L'equazione si abbassa di grado")
            Console.ReadKey()
            'Con Exit Sub si esce dalla Sub, che in questo caso
            'coincide con il programma
            Exit Sub
        End If

        'Anche delta fa parte del blocco delimitato da Sub ... End Sub
        Dim delta As Single = b ^ 2 - 4 * a * c

        'Esistono due soluzioni distinte
        If delta > 0 Then
            'Queste variabili fanno parte del blocco di If ... ElseIf
            Dim x1, x2 As Single
            'È possibile accedere senza problemi alla variabile
            'delta, poiché questo blocco è a sua volta
            'all'interno del blocco in cui è dichiarato delta
            x1 = (-b + Math.Sqrt(delta)) / (2 * a)
            x2 = (-b - Math.Sqrt(delta)) / (2 * a)
            Console.WriteLine("Soluzioni: ")
            Console.WriteLine("x1 = " & x1)
            Console.WriteLine("x2 = " & x2)

        'Esiste una soluzione doppia
        ElseIf delta = 0 Then
            'Questa variabile fa parte del blocco ElseIf ... Else
            Dim x As Single
            x = -b / (2 * a)
            Console.WriteLine("Soluzione doppia: ")
            Console.WriteLine("x = " & x)

        'Non esistono soluzioni in R
        Else
            Console.WriteLine("Non esistono soluzioni in R")
        End If

        Console.ReadKey()
    End Sub
End Module 

Se in questo codice, prima del Console.ReadKey(), finale provassimo a usare una fra le variabili x, x1 o x2, otterremmo un errore:

CodeBlocksError.jpg

Questo succede perchè nessuna variabile dichiarata all'interno di un blocco è accessibile al di fuori di esso. Con questo schemino rudimentale sarà più facile capire:

BlocksSchema.jpg
Le frecce verdi indicano che un codice può accedere a certe variabile, mentre quelle rosse indicano che non vi può accedere. Come salta subito agli occhi, sono permesse tutte le richieste che vanno dall'interno di un blocco verso l'esterno, mentre sono proibite tutte quelle che vanno dall'esterno verso l'interno. Questa regola vale sempre, in qualsiasi circostanza e per qualsiasi tipo di blocco: non ci sono eccezioni.

<< Precedente Prossimo >>
A proposito dell'autore

Programmatore e analista .NET 2005/2008/2010 (in particolare C# e VB.NET), anche nell'implementazione Mono per Linux. Conoscenze approfondite di Pascal, PHP, XML, HTML 4.01/5, CSS 2.1/3, Javascript (e jQuery). Conoscenze buone di C, LUA, GML, Ruby, XNA, AJAX e Assembly 68000. Competenze basilari di C++, SQL, Hlsl, Java.