Compartilhar via


Valores nulos (F#)

Este tópico descreve como o valor null é usado em F#.

Valor nulo

O valor nulo não é usado normalmente em F# valores ou variáveis. No entanto, null aparece como um valor anormal em determinadas situações. Se um tipo é definido em F#, null não é permitido como um valor regular, a menos que o AllowNullLiteral atributo é aplicado ao tipo. Se um tipo é definido em alguns outros.NET idioma, null é um valor possível, e quando você está Interoperando com esses tipos, o seu código de F# pode encontrar os valores nulos.

Para um tipo definido em F# e usadas estritamente de F#, a única maneira de criar um valor nulo, usando a biblioteca F# diretamente é usar Unchecked.defaultof ou Array.zeroCreate. No entanto, para um tipo de F# que é usado de outros.NET diferentes, ou se você estiver usando o tipo com uma API que não está escrita em F#, como o.NET Framework, podem ocorrer valores nulos.

Você pode usar o tipo deoption em F# quando você poderia usar uma variável de referência com um valor nulo possível em outro.NET language. Em vez de null, com um F# option o tipo, você usa o valor da opção None se não houver nenhum objeto. Você usa o valor da opção Some(obj) com um objeto obj quando há um objeto. Para obter mais informações, consulte Opções (F#).

O palavra-chave denull é uma palavra-chave válida na linguagem F# e você precisará usá-lo quando você estiver trabalhando com.NET Framework APIs ou outras APIs que são escritos em outro.NET language. As duas situações em que talvez seja necessário um valor nulo são quando você chamar um.NET de API e passar um valor nulo como um argumento e interpretar o valor de retorno ou parâmetro de saída de um.Chamada de método NET.

Para passar um valor nulo em uma.NET método, use apenas o null palavra-chave no código de chamada. O exemplo de código a seguir ilustra isso.

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

Interpretar um valor nulo que é obtido a partir de um.NET de método, use a correspondência de padrões, se possível. O exemplo de código a seguir mostra como usar a correspondência de padrões para interpretar o valor null retornado de ReadLine quando ele tenta ler após o fim do fluxo 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 ()

Valores nulos para tipos de F# também podem ser gerados de outras formas, como, por exemplo, quando você usa Array.zeroCreate, quais chamadas Unchecked.defaultof. Você deve ter cuidado com o código, para manter os valores nulos encapsulados. Em uma biblioteca é destinada apenas para F#, não é necessário verificar se há valores nulos em cada função. Se você estiver escrevendo uma biblioteca de interoperação com outros.NET idiomas, talvez você precise adicionar parâmetros de entrada de verificações de null e lançam um ArgumentNullException, da mesma maneira que faria no C# ou Visual Basic código.

Você pode usar o código a seguir para verificar se um valor arbitrário é nulo.

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

Consulte também

Referência

Corresponder expressões (F#)

Outros recursos

Valores (F#)