Guida al Visual Basic .NET
Capitolo 43° - I tipi Nullable
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 IfTuttavia, 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:
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 valoriUn 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:
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|