null 値 (F#)
このトピックでは、F# での null 値の使用方法について説明します。
null 値
F# では、通常、null 値を値にも変数にも使用しません。ただし、一部の状況では、null が変則的な値として表示されます。型が F# で定義されている場合は、AllowNullLiteral 属性が型に適用される場合を除いて、null は通常の値として許可されません。型が他の .NET 言語で定義されている場合は、null が有効な値となるため、それらの型と相互運用すると、F# コードで null 値が表示される可能性があります。
F# で定義され、F# からのみ使用する型の場合、F# ライブラリを直接使用して null 値を作成する唯一の方法は、Unchecked.defaultof または Array.zeroCreate を使用することです。ただし、他の .NET 言語から使用する F# の型の場合、または、F# で記述されていない .NET Framework などの API でその型を使用する場合は、null 値が表示されることがあります。
別の .NET 言語では表示される null 値を含む参照変数を使用する可能性がある場合は、F# の option 型を使用できます。F# の option 型では、オブジェクトが存在しない場合、null ではなく None オプション値を使用します。オブジェクトが存在する場合、obj オブジェクトで Some(obj) オプション値を使用します。詳細については、「オプション (F#)」を参照してください。
null キーワードは、F# 言語の有効なキーワードです。別の .NET 言語で記述された .NET Framework API または他の API を使用する場合は、このキーワードを使用する必要があります。null 値が必要になる可能性があるのは、.NET API を呼び出して引数として null 値を渡す場合と、.NET のメソッド呼び出しからの戻り値または出力パラメーターを解釈する場合の 2 つです。
.NET のメソッドに null 値を渡すには、呼び出し元のコードで 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 値は、Unchecked.defaultof を呼び出す Array.zeroCreate を使用する場合など、別の方法でも生成されることがあります。そのようなコードでは、null 値をカプセル化するように注意する必要があります。F# 専用のライブラリでは、各関数で null 値をチェックする必要はありません。他の .NET 言語と相互運用するライブラリを記述する場合は、C# または Visual Basic コードの場合と同じように、null の入力パラメーターに対するチェックを追加して ArgumentNullException をスローすることが必要になる可能性があります。
次のコードを使用して、任意の値が null であるかどうかを確認できます。
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."