Valores NULL

En este tema se describe cómo se usa el valor NULL en F#.

Valor NULL

El valor NULL no suele usarse en F# para valores o variables. Aun así, el valor NULL aparece como un valor anómalo en ciertas situaciones. Si se define un tipo en F#, no se permite el valor NULL como un valor normal a menos que se aplique el atributo AllowNullLiteral al tipo. Si un tipo se define en otro lenguaje .NET, NULL es un valor posible y, al interoperar con estos tipos, el código de F# podría encontrar valores NULL.

Para un tipo definido en F# que se usa estrictamente desde F#, la única manera de crear un valor NULL directamente mediante la biblioteca de F# es usar Unchecked.defaultof o Array.zeroCreate. Si un tipo de F# se usa desde otros lenguajes .NET, o si dicho tipo se usa con una API que no está escrita en F#, como .NET Framework, pueden producirse valores NULL.

Puede usar el tipo option en F# en caso de que vaya a usar una variable de referencia con un posible valor NULL en otro lenguaje .NET. En lugar de NULL, con un tipo option de F#, se usa el valor de opción None si no hay ningún objeto. El valor de opción Some(obj) se usa con un objeto obj cuando hay un objeto. Para obtener más información, vea Opciones. Tenga en cuenta que todavía puede empaquetar un valor null en una opción si se da la circunstancia de que, para Some x, x es null. Por este motivo, es importante usar None cuando un valor es null.

La palabra clave null es una palabra clave válida en F#, y tiene que usarla al trabajar con API de .NET Framework u otras API escritas en otro lenguaje .NET. Las dos situaciones en las que es posible que necesite un valor NULL son al llamar a una API de .NET y pasar un valor NULL como argumento, y al interpretar el valor devuelto o un parámetro de salida de una llamada al método .NET.

Para pasar un valor NULL a un método .NET, solo tiene que usar la palabra clave null en el código de llamada. En el siguiente ejemplo código se muestra cómo hacerlo.

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

Para interpretar un valor NULL obtenido de un método .NET, use la coincidencia de patrones si puede. En el ejemplo de código siguiente se muestra cómo usar la coincidencia de patrones para interpretar el valor NULL que se devuelve de ReadLine cuando intenta leer más allá del final de un flujo de entrada.

// 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
    ()

También se pueden generar valores NULL para tipos de F# de otras maneras, como cuando se usa Array.zeroCreate, que llama a Unchecked.defaultof. Debe tener cuidado con este código y mantener los valores NULL encapsulados. En una biblioteca diseñada solo para F#, no es necesario comprobar si hay valores NULL en cada función. Si está escribiendo una biblioteca para la interoperación con otros lenguajes .NET, es posible que tenga que agregar comprobaciones de parámetros de entrada NULL y generar un objeto ArgumentNullException, igual que en el código de C# o Visual Basic.

Puede usar el código siguiente para comprobar si un valor arbitrario es NULL.

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

Vea también