Partilhar via


Valores Nulos

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

Valor nulo

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

Para um tipo definido em F# e usado estritamente a partir 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 outras linguagens .NET, ou se você estiver usando esse tipo com uma API que não está escrita em F#, como o .NET Framework, valores nulos podem ocorrer.

Você pode usar o option tipo em F# quando você pode usar uma variável de referência com um possível valor nulo em outra linguagem .NET. Em vez de null, com um tipo F# option , você usa o valor None da opção se não houver nenhum objeto. Você usa o valor Some(obj) da opção com um objeto obj quando há um objeto. Para obter mais informações, consulte Opções. Observe que você ainda pode empacotar um null valor em uma Opção se, para Some x, x acontecer de ser null. Por isso, é importante que você use None quando um valor é null.

A null palavra-chave é uma palavra-chave válida em F#, e você precisa usá-la quando estiver trabalhando com APIs do .NET Framework ou outras APIs escritas em outra linguagem .NET. As duas situações em que você pode precisar de um valor nulo são quando você chama uma API .NET e passa um valor nulo como um argumento, e quando você interpreta o valor de retorno ou um parâmetro de saída de uma chamada de método .NET.

Para passar um valor nulo para um método .NET, basta usar a 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

Para interpretar um valor nulo que é obtido de um método .NET, use a correspondência de padrão, se possível. O exemplo de código a seguir mostra como usar a correspondência de padrão para interpretar o valor nulo que é retornado de ReadLine quando ele tenta ler após o final de um 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 F# também podem ser gerados de outras maneiras, como quando você usa Array.zeroCreate, que chama Unchecked.defaultof. Você deve ter cuidado com esse código para manter os valores nulos encapsulados. Em uma biblioteca destinada apenas a F#, não é necessário verificar valores nulos em todas as funções. Se você estiver escrevendo uma biblioteca para interoperação com outras linguagens .NET, talvez seja necessário adicionar verificações para parâmetros de entrada nulos e lançar um ArgumentNullException, assim como faz no código C# ou Visual Basic.

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