Поделиться через


Значения 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."

См. также