Compartilhar via


Valores nulos (F#)

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

Valor nulo

O valor nulo não é usado normalmente em F# para valores ou variáveis. No entanto, null é exibida 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 algum outro.NET language, null é um valor possível, e quando você está interoperando com esses tipos, seu código F# podem ser encontrados 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 dos outros.NET diferentes, ou se você estiver usando esse tipo com uma API que não está escrita em F#, como o.NET Framework, podem ocorrer valores nulos.

Você pode usar o option tipo de F# quando você poderia usar uma variável de referência com um valor nulo possível em outro.NET compatível. Em vez de null, com um F# option 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 existe um objeto. Para obter mais informações, consulte Opções (F#).

O null palavra-chave é uma palavra-chave válida no idioma F#, e você precisará usá-lo quando você estiver trabalhando com.NET Framework APIs ou outras APIs que são escritos em outro.NET compatível. As duas situações em que talvez seja necessário um valor nulo são quando você chamar um.NET API e passar um valor nulo como um argumento e, quando você 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 de um.NET 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 depois do 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 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#, você não precisará verificar se há valores nulos em cada função. Se você estiver escrevendo uma biblioteca de interoperação com os outros.NET diferentes, talvez seja necessário adicionar parâmetros de entrada de verificações para 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 for nulo.

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

Consulte também

Referência

Expressões match (F#)

Outros recursos

Valores (F#)