Udostępnij za pośrednictwem


Wartości null

W tym temacie opisano sposób użycia wartości null w języku F#.

Wartość null

Wartość null nie jest zwykle używana w języku F# dla wartości lub zmiennych. Jednak wartość null jest wyświetlana jako nietypowa wartość w niektórych sytuacjach. Jeśli typ jest zdefiniowany w języku F#, wartość null nie jest dozwolona jako wartość regularna, chyba że atrybut AllowNullLiteral jest stosowany do typu. Jeśli typ jest zdefiniowany w innym języku .NET, wartość null jest możliwą wartością, a podczas współdziałania z takimi typami kod F# może napotkać wartości null.

W przypadku typu zdefiniowanego w języku F# i używanego ściśle z języka F#jedynym sposobem utworzenia wartości null przy użyciu biblioteki języka F# jest użycie polecenia Unchecked.defaultof lub Array.zeroCreate. Jednak w przypadku typu F# używanego z innych języków platformy .NET lub jeśli używasz tego typu z interfejsem API, który nie jest napisany w języku F#, na przykład w programie .NET Framework, mogą wystąpić wartości null.

Możesz użyć option typu w języku F#, jeśli możesz użyć zmiennej referencyjnej z możliwą wartością null w innym języku .NET. Zamiast wartości null, w przypadku typu F# option należy użyć wartości None opcji, jeśli nie ma obiektu. Należy użyć wartości Some(obj) opcji z obiektem obj , gdy istnieje obiekt. Aby uzyskać więcej informacji, zobacz Opcje. Należy pamiętać, że nadal można spakować null wartość do opcji, jeśli dla Some xparametru x ma wartość null. W związku z tym ważne jest, aby używać None wartości , gdy wartość to null.

Słowo null kluczowe jest prawidłowym słowem kluczowym w języku F#i należy go używać podczas pracy z interfejsami API programu .NET Framework lub innymi interfejsami API napisanymi w innym języku platformy .NET. Dwie sytuacje, w których może być potrzebna wartość null, to podczas wywoływania interfejsu API platformy .NET i przekazywania wartości null jako argumentu oraz interpretowania wartości zwracanej lub parametru wyjściowego z wywołania metody .NET.

Aby przekazać wartość null do metody .NET, wystarczy użyć null słowa kluczowego w kodzie wywołującym. Pokazano to w poniższym przykładzie kodu.

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

Aby zinterpretować wartość null uzyskaną z metody .NET, użyj dopasowania wzorca, jeśli to możliwe. W poniższym przykładzie kodu pokazano, jak używać dopasowania wzorca w celu zinterpretowania wartości null zwracanej z ReadLine momentu próby odczytania końca strumienia wejściowego.

// 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
    ()

Wartości null dla typów języka F# można również wygenerować na inne sposoby, na przykład w przypadku użycia Array.zeroCreatemetody , która wywołuje metodę Unchecked.defaultof. Należy zachować hermetyzację wartości null przy użyciu takiego kodu. W bibliotece przeznaczonej tylko dla języka F#nie trzeba sprawdzać wartości null w każdej funkcji. Jeśli piszesz bibliotekę do współdziałania z innymi językami platformy .NET, może być konieczne dodanie sprawdzania parametrów wejściowych o wartości null i zgłoszenie ArgumentNullExceptionelementu , tak jak w kodzie C# lub Visual Basic.

Możesz użyć następującego kodu, aby sprawdzić, czy dowolna wartość ma wartość null.

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

Zobacz też