Значения NULLNull Values

В этом разделе описывается использование значения null в F#.This topic describes how the null value is used in F#.

Значение NULLNull Value

Значение null обычно не используется в F# для значения или переменные.The null value is not normally used in F# for values or variables. Тем не менее значение null отображается как Аномальное значение в определенных ситуациях.However, null appears as an abnormal value in certain situations. Если тип определен в F#, значение null не разрешаются как значение регулярных, пока AllowNullLiteral атрибут применяется к типу.If a type is defined in F#, null is not permitted as a regular value unless the AllowNullLiteral attribute is applied to the type. Если тип определен в другом языке .NET, null является возможным значением, и при взаимодействии с такими типами вашей F# код может обнаружить значения null.If a type is defined in some other .NET language, null is a possible value, and when you are interoperating with such types, your F# code might encounter null values.

Для типа, определенного в F# и используется исключительно из F#, единственным способом создать значение null с помощью F# библиотеки непосредственно заключается в использовании Unchecked.defaultof или Array.zeroCreate.For a type defined in F# and used strictly from F#, the only way to create a null value using the F# library directly is to use Unchecked.defaultof or Array.zeroCreate. Однако для F# тип, используемый из других языков .NET, или если вы используете этот тип с интерфейсом API, не записывается в F#, например .NET Framework, могут возникать значения null.However, for an F# type that is used from other .NET languages, or if you are using that type with an API that is not written in F#, such as the .NET Framework, null values can occur.

Можно использовать option введите F# когда можно использовать ссылку на переменную с возможным значением null на другом языке .NET.You can use the option type in F# when you might use a reference variable with a possible null value in another .NET language. Вместо значения null с помощью F# option типа, используйте указанный ниже параметр None Если объект отсутствует.Instead of null, with an F# option type, you use the option value None if there is no object. Используйте указанный ниже параметр Some(obj) с объектом obj при отсутствии объекта.You use the option value Some(obj) with an object obj when there is an object. Дополнительные сведения: Параметры.For more information, see Options. Обратите внимание, что по-прежнему можно упаковать null значения в параметр if, для Some x, x окажется null.Note that you can still pack a null value into an Option if, for Some x, x happens to be null. По этой причине важно использовании None значения null.Because of this, it is important you use None when a value is null.

null Ключевое слово является допустимым ключевым словом F# язык и необходимо использовать при работе с API-интерфейсы .NET Framework или другие API, которые записываются на другом языке .NET.The null keyword is a valid keyword in the F# language, and you have to use it when you are working with .NET Framework APIs or other APIs that are written in another .NET language. Две ситуации, в которых может потребоваться значение null, при вызове .NET API и передать значение null в качестве аргумента, и при интерпретации возвращаемого значения или выходного параметра из вызова метода .NET.The two situations in which you might need a null value are when you call a .NET API and pass a null value as an argument, and when you interpret the return value or an output parameter from a .NET method call.

Чтобы передать значение null в метод .NET, просто используйте null ключевое слово в вызывающем коде.To pass a null value to a .NET method, just use the null keyword in the calling code. Это показано в следующем примере кода.The following code example illustrates this.

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, используйте сопоставление шаблонов, если это возможно.To interpret a null value that is obtained from a .NET method, use pattern matching if you can. В следующем примере кода показано, как использовать сопоставление шаблонов для интерпретации значения null, возвращаемые из ReadLine при попытке чтения после конца входного потока.The following code example shows how to use pattern matching to interpret the null value that is returned from ReadLine when it tries to read past the end of an input stream.

// 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 values for F# types can also be generated in other ways, such as when you use Array.zeroCreate, which calls Unchecked.defaultof. Будьте внимательны с такой код сохранять значения null, который инкапсулирован.You must be careful with such code to keep the null values encapsulated. В библиотеке, предназначенная только для F#, нет необходимости проверять значения null в каждой функции.In a library intended only for F#, you do not have to check for null values in every function. Если вы создаете библиотеку для взаимодействия с другими языками .NET, может потребоваться добавить проверки значений NULL, входные параметры и создавать ArgumentNullException, так же, как это делается в коде C# или Visual Basic.If you are writing a library for interoperation with other .NET languages, you might have to add checks for null input parameters and throw an ArgumentNullException, just as you do in C# or Visual Basic code.

Можно использовать следующий код для проверки, если произвольное значение null.You can use the following code to check if an arbitrary value is null.

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

См. такжеSee also