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 - I tipi Nullable

Guida al Visual Basic .NET

Capitolo 43° - I tipi Nullable

<< Precedente Prossimo >>


I tipi Nullable costituiscono una utile applicazione dei generics alla gestione dei database. Infatti, quando si lavora con dei database, capita molto spesso di trovare alcune celle vuote, ossia il cui valore non è stato impostato. In questo caso, l'oggetto che media tra il database e il programma - oggetto che analizzeremo solo nella sezione C - pone in tali celle uno speciale valore che significa "non contiene nulla". Questo valore è pari a DBNull.Value, una costante statica preimpostata di tipo DBNull, appunto. Essendo un tipo reference, l'assegnare il valore di una cella a una variabile value può comportare errori nel caso tale cella contenga il famigerato DBNull, poiché non si è in grado di effettuare una conversione. Comportamenti del genere costringono (anzi, costringevano) i programmatori a scrivere una quantità eccessiva di costrutti di controllo del tipo:
If Cell.Value IsNot DBNull.Value Then
    Variable = Cell.Value
Else
    Variable = 0
    'Per impostare il valore di default, bisognava ripetere
    'questi If tante volte quanti erano i tipi in gioco, poiché
    'non c'era modo di assegnare un valore Null a tutti 
    'in un solo colpo
End If
Tuttavia, con l'avvento dei generics, nella versione 2005 del linguaggio, questi problemi sono stati arginati, almeno in parte e almeno per chi conosce i tipi nullable. Questi speciali tipi sono strutture generics che possono anche accettare valori reference come Nothing: ovviamente, dato che i problemi insorgono solo quando si tratta di tipi value, i tipi generics collegati che è lecito specificare quando si usa nullable devono essere tipi value (quindi c'è un vincolo di struttura).
Ci sono due sintassi molto diverse per dichiarare tipi nullable, una esplicita e una implicita:
'Dichiarazione esplicita:
Dim [Nome] As Nullable(Of [Tipo])

'Dichiarazione implicita:
Dim [Nome] As [Tipo]?
La seconda si attua postponendo un punto interrogativo al nome del tipo: una sintassi molto breve e concisa che tuttavia può anche sfuggire facilmente all'occhio. Una volta dichiarata, una variabile nullable può essere usata come una comunissima variabile del tipo generic collegato specificato. Essa, tuttavia, espone alcuni membri in più rispetto ai normali tipi value, nella fattispecie:
  • HasValue : proprietà readonly che restituisce True se l'oggetto contiene un valore;
  • Value : proprietà readonly che restituisce il valore dell'oggetto, nel caso esista;
  • GetValueOrDefault() : funzione che restituisce Value se l'oggetto contiene un valore, altrimenti il valore di default per quel tipo (ad esempio 0 per i tipi numerici). Ha un overload che accetta un parametro - GetValurOrDefault(X): in questo caso, se l'oggetto non contiene nulla, viene restituito X al posto del valore di default.
Ecco un esempio:
Module Module1

    Sub Main()
        'Tre variabili di tipo value dichiarate come
        'nullable nei due modi diversi consentiti
        Dim Number As Integer?
        Dim Data As Nullable(Of Date)
        Dim Cost As Double?
        Dim Sent As Nullable(Of Boolean)

        'Ammettiamo di star controllando un database:
        'questo array di oggetti rappresenta il contenuto
        'di una riga
        Dim RowValues() As Object = {DBNull.Value, New Date(2009, 7, 1), 67.99, DBNull.Value}

        'Con un solo ciclo trasforma tutti i DBNull.Value 
        'in Nothing, poiché i nullable supportano solo
        'Nothing come valore nullo
        For I As Int16 = 0 To RowValues.Length - 1
            If RowValues(I) Is DBNull.Value Then
                RowValues(I) = Nothing
            End If
        Next

        'Assegna alle variabili i valori contenuti nell'array:
        'non ci sono mai problemi in questo codice, poiché,
        'trattandosi di tipi nullable, questi oggetti possono
        'accettare anche valori Nothing. In questo esempio,
        'Number e Sent riceveranno un Nothing come valore: la
        'loro proprietà HasValue varrà False.
        Number = RowValues(0)
        Data = RowValues(1)
        Cost = RowValues(2)
        Sent = RowValues(3)

        'Scrive a schermo il valore di ogni variabile, se ne
        'contiene uno, oppure il valore di default se non
        'contiene alcun valore.
        Console.WriteLine("{0} {1} {2} {3}", _
            Number.GetValueOrDefault, _
            Data.GetValueOrDefault, _
            Cost.GetValueOrDefault, _
            Sent.GetValueOrDefault)

        'Provando a stampare una variabile nullable priva
        'di valore senza usare la funzione GetValueOrDefault,
        'semplicemente non stamperete niente:
        '  Console.WriteLine(Number)
        'Non stampa niente e va a capo.
        
        Console.ReadKey()
    End Sub

End Module


Logica booleana a tre valori

Un valore nullable Boolean può assumere virtualmente tre valori: vero (True), falso (False) e null (senza valore). Usando una variabile booleana nullable come operando per gli operatori logici, si otterranno risultati diversi a seconda che essa abbia o non abbia un valore. Le nuove combinazioni che possono essere eseguite si vanno ad aggiungere a quelle già esistenti per creare un nuovo tipo di logica elementare, detta, appunto, "logica booleana a tre valori". Essa segue questo schema nei casi in cui un operando sia null:

Valore 1 Operatore Valore 2 Risultato
True And Null Null
False And Null False
True Or Null True
False Or Null Null
True Xor Null Null
False Xor Null Null



<< 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.