Значения NULL
В этом разделе описывается, как значение NULL используется в F#.
Значение NULL
Значение NULL обычно не используется в F# для значений или переменных. Однако значение NULL появляется как ненормальное значение в определенных ситуациях. Если тип определен в F#, значение NULL не допускается как регулярное значение, если к типу не применяется атрибут AllowNullLiteral . Если тип определен в другом языке .NET, значение NULL возможно, и при взаимодействии с такими типами код F# может столкнуться со значениями NULL.
Для типа, определенного в F# и используемого строго из F#, единственный способ создать значение NULL с помощью библиотеки F# напрямую — использовать Un проверка ed.defaultof или Array.zeroCreate. Однако для типа F#, используемого на других языках .NET, или если вы используете этот тип с API, который не написан в F#, например платформа .NET Framework, значения NULL могут возникать.
Тип в F# можно использовать, если можно использовать option
эталонную переменную с возможным значением NULL на другом языке .NET. Вместо null с типом F# option
используйте значение None
параметра, если нет объекта. При наличии объекта obj
используется значение Some(obj)
параметра. Дополнительные сведения: Параметры. Обратите внимание, что значение по-прежнему можно упаковать null
в параметр, если, например Some x
, x
будет null
. Из-за этого важно использовать None
при значении null
.
Ключевое слово null
является допустимым ключевое слово в F#, и его необходимо использовать при работе с ПЛАТФОРМА .NET FRAMEWORK API или другими API, написанными на другом языке .NET. Две ситуации, в которых может потребоваться значение NULL, возникают при вызове API .NET и передаче значения NULL в качестве аргумента, а также при интерпретации возвращаемого значения или выходного параметра из вызова метода .NET.
Чтобы передать значение NULL в метод .NET, просто используйте null
ключевое слово в вызывающем коде. Это показано в следующем примере кода.
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
Чтобы интерпретировать значение NULL, полученное из метода .NET, используйте сопоставление шаблонов, если это возможно. В следующем примере кода показано, как использовать сопоставление шаблонов для интерпретации значения NULL, возвращаемого при ReadLine
попытке прочитать после конца входного потока.
// 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
()
Значения NULL для типов F# также могут создаваться другими способами, например при использовании Array.zeroCreate
, которые вызываются Unchecked.defaultof
. Для сохранения инкапсулированных значений null необходимо тщательно использовать такой код. В библиотеке, предназначенной только для F#, не требуется проверка для значений NULL в каждой функции. Если вы пишете библиотеку для взаимодействия с другими языками .NET, вам может потребоваться добавить проверка для параметров ввода null и вызвать исключениеArgumentNullException
, как и в коде C# или Visual Basic.
Следующий код можно использовать для проверка, если произвольное значение равно null.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."