Compartir a través de


Valores NULL (F#)

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

Valor NULL

El valor NULL no se utiliza habitualmente en F# para valores o variables. Sin embargo, NULL aparece como valor anormal en determinadas situaciones. Si se define un tipo en F#, no se permite el valor NULL, a menos que se aplique el atributo AllowNullLiteral al tipo. Si un tipo se define en algún otro lenguaje .NET, NULL es un valor posible y, al interoperar con esos tipos, el código de F# podría encontrar valores NULL.

En el caso de un tipo que se ha definido y se emplea estrictamente en F#, la única manera de crear un valor NULL usando directamente la biblioteca de F# es utilizar Unchecked.defaultof o Array.zeroCreate. Sin embargo, para tipos de F# que se utilizan desde otros lenguajes .NET, o cuando se utiliza ese tipo con una API que no está escrita en F# (como .NET Framework), puede haber valores NULL.

El tipo option se puede utilizar en F# en aquellos casos en que podría utilizarse una variable de referencia con un posible valor NULL en otro lenguaje .NET. En lugar de NULL, con el tipo option de F# se utiliza el valor de opción None si no hay ningún objeto. El valor de opción Some(obj) se utiliza con un objeto obj cuando hay un objeto. Para obtener más información, vea Opciones (F#).

La palabra clave null es una palabra clave válida en el lenguaje F#. Se debe utilizar cuando se trabaja con API de .NET Framework o con otras API escritas en otro lenguaje .NET. Las dos situaciones en las que podría necesitar 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 a un método de .NET.

Para pasar un valor NULL a un método de .NET, basta con utilizar 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 que se obtiene a partir de un método de .NET, se debe utilizar la coincidencia de modelos si es posible. En el ejemplo de código siguiente se muestra cómo utilizar la coincidencia de modelos para interpretar el valor NULL que ReadLine devuelve al intentar 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 ()

Los valores NULL para los tipos de F# también se pueden generar de otras maneras; por ejemplo, mediante Array.zeroCreate, que invoca Unchecked.defaultof. Es preciso tener precaución con este tipo de código, a fin de mantener encapsulados los valores NULL. En una biblioteca diseñada únicamente para F#, no es preciso comprobar si hay valores NULL en cada función. Si escribe una biblioteca para que interopere con otros lenguajes .NET, puede que tenga que agregar comprobaciones de parámetros de entrada NULL e iniciar una excepción ArgumentNullException, tal y como se hace en el código de C# o de Visual Basic.

Puede utilizar el siguiente código 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

Referencia

Expresiones match (F#)

Otros recursos

Valores (F#)