共用方式為


Null 值

本主題描述如何在 F# 中使用 Null 值。

Null 值

Null 值通常不會用於 F# 中的值或變數。 不過,在某些情況下,Null 會顯示為異常值。 如果型別是在 F# 中定義,除非 AllowNullLiteral 屬性套用至型別,否則不允許將 Null 當做一般值使用。 如果型別是以其他 .NET 語言定義,則 Null 是可能的值,而且當您與這類型別交互操作時,您的 F# 程式碼可能會遇到 Null 值。

針對 F# 中定義且從 F# 嚴格使用的型別,直接使用 F# 程式庫建立 Null 值的唯一方法是使用 Unchecked.defaultofArray.zeroCreate。 不過,如果是從其他 .NET 語言使用的 F# 型別,或者,如果您使用該型別搭配未以 F# 撰寫的 API,例如 .NET Framework,可能會發生 Null 值。

當您可能以另一種 .NET 語言使用具有可能 Null 值的參考變數時,可以在 F# 中使用 option 型別。 如果沒有物件,請使用選項值 None,而不是搭配 F# option 型別使用 Null。 當您有物件時,您可以使用選項值 Some(obj) 搭配物件 obj。 如需詳細資訊,請參閱選項。 請注意,如果針對 Some xx 剛好是 null,您仍然可以將 null 值封裝到 Option 中。 因此,當值為 null 時,請務必使用 None

null 關鍵字是 F# 中的有效關鍵字,而且當您使用以其他 .NET 語言撰寫的 .NET Framework API 或其他 API 時,必須加以使用。 您可能需要 Null 值的兩種情況是當您呼叫 .NET API 並傳遞 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

若要解譯從方法取得的 .NET Null 值,請在可行時使用模式比對。 下列程式碼範例示範如何使用模式比對,來解譯在嘗試讀取超過輸入資料流結尾時 ReadLine 所傳回的 Null 值。

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

F# 型別的 Null 值也可以使用其他方式產生,例如當您使用 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."

另請參閱