Null 值
本主題描述如何在 F# 中使用 Null 值。
Null 值
Null 值通常不會用於 F# 中的值或變數。 不過,在某些情況下,Null 會顯示為異常值。 如果型別是在 F# 中定義,除非 AllowNullLiteral 屬性套用至型別,否則不允許將 Null 當做一般值使用。 如果型別是以其他 .NET 語言定義,則 Null 是可能的值,而且當您與這類型別交互操作時,您的 F# 程式碼可能會遇到 Null 值。
針對 F# 中定義且從 F# 嚴格使用的型別,直接使用 F# 程式庫建立 Null 值的唯一方法是使用 Unchecked.defaultof 或 Array.zeroCreate。 不過,如果是從其他 .NET 語言使用的 F# 型別,或者,如果您使用該型別搭配未以 F# 撰寫的 API,例如 .NET Framework,可能會發生 Null 值。
當您可能以另一種 .NET 語言使用具有可能 Null 值的參考變數時,可以在 F# 中使用 option
型別。 如果沒有物件,請使用選項值 None
,而不是搭配 F# option
型別使用 Null。 當您有物件時,您可以使用選項值 Some(obj)
搭配物件 obj
。 如需詳細資訊,請參閱選項。 請注意,如果針對 Some x
,x
剛好是 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."