Condividi tramite


Valori Null

In questo argomento viene descritto come viene usato il valore Null in F#.

Valore Null

Il valore Null non viene in genere usato in F# per valori o variabili. Tuttavia, null viene visualizzato come valore anomalo in determinate situazioni. Se un tipo è definito in F#, null non è consentito come valore regolare, a meno che non venga applicato al tipo l'attributo AllowNullLiteral . Se un tipo è definito in un altro linguaggio .NET, Null è un valore possibile e quando si interagisce con tali tipi, il codice F# potrebbe riscontrare valori Null.

Per un tipo definito in F# e usato rigorosamente da F#, l'unico modo per creare un valore Null usando direttamente la libreria F# consiste nell'usare Unchecked.defaultof o Array.zeroCreate. Tuttavia, per un tipo F# usato da altri linguaggi .NET o se si usa tale tipo con un'API non scritta in F#, ad esempio .NET Framework, possono verificarsi valori Null.

È possibile usare il option tipo in F# quando è possibile usare una variabile di riferimento con un valore Null possibile in un altro linguaggio .NET. Anziché null, con un tipo F# option si usa il valore None dell'opzione se non è presente alcun oggetto. Usare il valore Some(obj) dell'opzione con un oggetto obj quando è presente un oggetto . Per altre informazioni, vedere Opzioni. Si noti che è comunque possibile comprimere un null valore in un'opzione se, per Some x, x si verifica che sia null. Per questo motivo, è importante usare None quando un valore è null.

La null parola chiave è una parola chiave valida in F# ed è necessario usarla quando si usano le 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 al metodo .NET.

Per passare un valore Null a un metodo .NET, è sufficiente usare la null parola chiave 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, usare i criteri di ricerca se possibile. Nell'esempio di codice seguente viene illustrato come usare criteri di ricerca 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 usa Array.zeroCreate, che chiama Unchecked.defaultof. È necessario prestare attenzione a questo codice per mantenere incapsulati i valori Null. In una libreria destinata solo a F#, non è necessario verificare la presenza di valori Null in ogni funzione. Se si scrive una libreria per l'interoperabilità con altri linguaggi .NET, potrebbe essere necessario aggiungere controlli per i parametri di input Null e generare un'eccezione ArgumentNullException, proprio come nel codice C# o Visual Basic.

È possibile usare il codice seguente per verificare se un valore arbitrario è Null.

match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."

Vedi anche