Valores nulos
Este tópico descreve como o valor nulo é usado no F#.
Valor nulo
O valor nulo normalmente não é usado no F# para valores ou variáveis. No entanto, nulo aparece como um valor anormal em determinadas situações. Se um tipo for definido no F#, nulo não será permitido como um valor regular, a menos que o atributo AllowNullLiteral seja aplicado ao tipo. Se um tipo for definido em alguma outra linguagem .NET, nulo será um valor possível e, quando você estiver interoperando com esses tipos, seu código F# poderá encontrar valores nulos.
Para um tipo definido no F# e usado 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 F# usado de outras linguagens .NET ou se você estiver usando esse tipo com uma API que não é escrita no F#, como o .NET Framework, poderão ocorrer valores nulos.
Você poderá usar o tipo option
no F# ao usar uma variável de referência com um possível valor nulo em outra linguagem .NET. Em vez de nulo, com um tipo option
F#, use 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, veja Opções. Observe que você ainda pode empacotar um valor null
em uma Opção se, para Some x
, acontecer de x
ser null
. Por isso, é importante que você use None
quando um valor for null
.
A palavra-chave null
é uma palavra-chave válida no F# e você precisa usá-la quando estiver trabalhando com .NET Framework APIs 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 retornado 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 palavra-chave null
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 obtido de um método .NET, 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 nulo que é retornado de ReadLine
quando ele tenta ler além 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
()
Os 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 somente ao F#, você não precisa verificar se há valores nulos em cada função. 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 uma ArgumentNullException
, assim como você faz no código do 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."