Nilai Null
Topik ini menjelaskan cara penggunaan nilai null dalam F#.
Nilai Null
Nilai null biasanya tidak digunakan dalam F# untuk nilai atau variabel. Namun, null muncul sebagai nilai abnormal dalam situasi tertentu. Jika suatu jenis didefinisikan dalam F#, null tidak diizinkan sebagai nilai reguler kecuali atribut AllowNullLiteral diterapkan ke jenis tersebut. Jika suatu jenis didefinisikan dalam beberapa bahasa .NET lainnya, null adalah nilai yang mungkin, dan ketika Anda beroperasi dengan jenis tersebut, kode F# mungkin menemukan nilai null.
Untuk jenis yang ditentukan dalam F# dan digunakan secara ketat dari F#, satu-satunya cara untuk membuat nilai null menggunakan pustaka F# secara langsung adalah dengan menggunakan Unchecked.defaultof atau Array.zeroCreate. Namun nilai null dapat muncul pada jenis F# yang digunakan dari bahasa .NET lainnya, atau jika Anda menggunakan jenis tersebut dengan API yang tidak ditulis dalam F#, seperti .NET Framework.
Anda dapat menggunakan jenis option
di F# ketika Anda menggunakan variabel referensi dengan nilai null yang mungkin dalam bahasa .NET lain. Alih-alih menggunakan null, dengan jenis F# option
, Anda dapat menggunakan nilai opsi None
jika tidak ada objek. Gunakan nilai opsi Some(obj)
dengan objek obj
saat ada objek. Untuk informasi selengkapnya, lihat Opsi. Anda masih dapat mengemas nilai null
ke dalam Opsi, jika untuk Some x
, x
kebetulan adalah null
. Karenanya, perlu menggunakan None
ketika nilai adalah null
.
Kata kunci null
adalah kata kunci yang valid di F#, dan Anda harus menggunakannya saat bekerja dengan API .NET Framework atau API lain yang ditulis dalam bahasa .NET lain. Dua situasi di mana nilai null diperlukan adalah ketika Anda memanggil .NET API dan meneruskan nilai null sebagai argumen, dan ketika Anda menafsirkan nilai yang dimunculkan atau parameter output dari panggilan metode .NET.
Untuk meneruskan nilai null ke metode .NET, cukup gunakan kata kunci null
dalam kode panggilan. Contoh kode berikut menggambarkan hal ini.
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
Untuk menafsirkan nilai null yang diperoleh dari metode .NET, gunakan pencocokan pola jika Anda bisa. Contoh kode berikut menunjukkan cara menggunakan pencocokan pola untuk menginterpretasikan nilai null munculk dari ReadLine
saat mencoba membaca melewati akhir aliran input.
// 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
()
Nilai null untuk jenis F# juga dapat dihasilkan dengan cara lain, seperti saat Anda menggunakan Array.zeroCreate
yang memanggil Unchecked.defaultof
. Anda harus berhati-hati dengan kode tersebut untuk menjaga nilai null dienkapsulasi. Di pustaka yang ditujukan hanya untuk F#, Anda tidak perlu memeriksa nilai null di setiap fungsi. Jika Anda menulis pustaka untuk interoperasi dengan bahasa .NET lainnya, mungkin Anda harus menambahkan pemeriksaan untuk parameter input null dan mengeluarkan ArgumentNullException
, seperti yang Anda lakukan dalam C# atau kode Visual Basic.
Anda dapat menggunakan kode berikut untuk memeriksa apakah nilai arbitrer adalah null.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."