Valori Null (F#)
In questo argomento viene descritta la modalità di utilizzo del valore Null in F#.
Valore Null
Il valore Null non viene in genere utilizzato in F# per valori o variabili. In determinate situazioni, tuttavia, Null appare come valore anomalo. Se in F# viene definito un tipo, non è consentito come valore normale il valore Null, a meno che al tipo non venga applicato l'attributo AllowNullLiteral. Se un tipo è definito in un altro linguaggio .NET, Null è un valore possibile e, quando si interagisce con tali tipi, nel codice F# potrebbero essere presenti valori Null.
Per un tipo definito in F# e utilizzato in modo esplicito da F#, l'unico modo in cui creare un valore null utilizzando in modo diretto la libreria F# consiste nell'utilizzare Unchecked.defaultof o Array.zeroCreate. Per un tipo F# utilizzato dagli altri linguaggi .NET oppure se si utilizza tale tipo con un'API non scritta in F#, ad esempio .NET Framework, possono tuttavia essere presenti valori Null.
È possibile utilizzare il tipo option in F# quando è possibile utilizzare una variabile di riferimento con un possibile valore Null in un altro linguaggio .NET. Anziché utilizzare il valore Null, con un tipo option F# è possibile utilizzare il valore di opzione None, se non vi è alcun oggetto. È possibile utilizzare il valore di opzione Some(obj) con un oggetto obj quando è presente un oggetto. Per ulteriori informazioni, vedere Opzioni (F#).
La parola chiave null è una parola chiave valida nel linguaggio F# ed è necessario utilizzarla quando si lavora con API .NET Framework o altre API scritte in un altro linguaggio .NET. Le due situazioni in cui potrebbe essere necessario un valore Null sono quando si chiama un'API .NET e si passa un valore Null come argomento e quando si interpreta il valore restituito o un parametro di output da una chiamata a un metodo .NET.
Per passare un valore Null a un metodo .NET, utilizzare solo la parola chiave null nel codice chiamante. Questo aspetto è illustrato nell'esempio di codice seguente.
open System
// Pass a null value to a .NET method.
let ParseDateTime (str: string) =
let (success, res) = DateTime.TryParse(str, null, System.Globalization.DateTimeStyles.AssumeUniversal)
if success then
Some(res)
else
None
Per interpretare un valore Null ottenuto da un metodo .NET, utilizzare la corrispondenza dei modelli, se possibile. Nell'esempio di codice seguente viene illustrato come utilizzare la corrispondenza dei modelli per interpretare il valore Null restituito da ReadLine quando tenta di leggere oltre la fine di un flusso di input.
// Open a file and create a stream reader.
let fileStream1 =
try
System.IO.File.OpenRead("TextFile1.txt")
with
| :? System.IO.FileNotFoundException -> printfn "Error: TextFile1.txt not found."; exit(1)
let streamReader = new System.IO.StreamReader(fileStream1)
// ProcessNextLine returns false when there is no more input;
// it returns true when there is more input.
let ProcessNextLine nextLine =
match nextLine with
| null -> false
| inputString ->
match ParseDateTime inputString with
| Some(date) -> printfn "%s" (date.ToLocalTime().ToString())
| None -> printfn "Failed to parse the input."
true
// A null value returned from .NET method ReadLine when there is
// no more input.
while ProcessNextLine (streamReader.ReadLine()) do ()
I valori Null per i tipi F# possono essere generati anche in altri modi, ad esempio quando si utilizza Array.zeroCreate, che chiama Unchecked.defaultof. Con codice di questo tipo è necessario prestare attenzione per mantenere i valori Null incapsulati. In una libreria destinata solo a F#, non è necessario controllare i valori Null in ogni funzione. Se si scrive una libreria per l'interazione con altri linguaggi .NET, potrebbe essere necessario aggiungere controlli per i parametri di input Null e generare un'eccezione ArgumentNullException, in modo analogo a quanto avviene nel codice C# o Visual Basic.
È possibile utilizzare il codice seguente per controllare se un valore arbitrario è null.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."