Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan bagaimana nilai null digunakan dalam F#.
Nilai 'null' sebelum F# 9
Nilai null biasanya tidak digunakan dalam F# untuk nilai atau variabel. Namun, null muncul sebagai nilai abnormal dalam situasi tertentu. Jika jenis didefinisikan dalam F#, null tidak diizinkan sebagai nilai reguler kecuali atribut AllowNullLiteral diterapkan ke jenis . Jika jenis didefinisikan dalam beberapa bahasa .NET lainnya, null adalah nilai yang mungkin, dan ketika Anda mengoperasikan dengan jenis tersebut, kode F# Anda mungkin menemukan nilai null.
Untuk jenis yang ditentukan dalam F# dan yang hanya digunakan dalam F#, satu-satunya cara membuat nilai null menggunakan pustaka F# secara langsung adalah dengan menggunakan Unchecked.defaultof atau Array.zeroCreate. Namun, untuk jenis F# yang digunakan dari bahasa .NET lainnya, atau jika Anda menggunakan jenis tersebut dengan API yang tidak ditulis dalam F#, seperti .NET Framework, nilai null dapat terjadi.
Anda dapat menggunakan tipe option di F# ketika Anda mungkin menggunakan variabel referensi dengan kemungkinan nilai null dalam bahasa .NET lain. Alih-alih null, dengan jenis F# option, Anda menggunakan nilai opsi None jika tidak ada objek. Anda menggunakan nilai opsi Some(obj) dengan objek obj saat ada objek. Untuk informasi selengkapnya, lihat opsi . Perhatikan bahwa Anda masih dapat mengemas nilai null ke dalam pilihan jika, untuk Some x, x ternyata adalah null. Karena itu, penting bagi Anda menggunakan None saat nilai adalah null.
Kata kunci null adalah kata kunci yang valid di F#, dan Anda harus menggunakannya saat Anda bekerja dengan API .NET Framework atau API lain yang ditulis dalam bahasa .NET lain. Dua situasi di mana Anda mungkin memerlukan nilai null adalah ketika Anda memanggil .NET API dan meneruskan nilai null sebagai argumen, dan ketika Anda menginterpretasikan nilai pengembalian 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 mengilustrasikan 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 menginterpretasikan 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 yang dikembalikan 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 ketika Anda menggunakan Array.zeroCreate, yang memanggil Unchecked.defaultof. Anda harus berhati-hati dengan kode tersebut untuk menjaga nilai null tetap terenkapsulasi. Di pustaka yang hanya ditujukan untuk F#, Anda tidak perlu memeriksa nilai null di setiap fungsi. Jika Anda menulis pustaka untuk interoperatasi dengan bahasa .NET lainnya, Anda mungkin harus menambahkan pemeriksaan untuk parameter input null dan melempar ArgumentNullException, seperti yang Anda lakukan dalam kode C# atau Visual Basic.
Anda dapat menggunakan kode berikut untuk memeriksa apakah nilai arbitrer null.
match box value with
| null -> printf "The value is null."
| _ -> printf "The value is not null."
Nilai Null dimulai dengan F# 9
Di F# 9, kemampuan tambahan ditambahkan ke bahasa untuk menangani jenis referensi yang dapat memiliki null sebagai nilai. Mereka nonaktif secara default - untuk mengaktifkannya, properti berikut harus dimasukkan ke dalam file proyek Anda:
<Nullable>enable</Nullable>
Ini meneruskan bendera --checknulls+ ke kompilator F# dan menetapkan direktif praprosesor NULLABLE untuk build.
Untuk secara eksplisit mengaktifkan nullability, deklarasi tipe harus diberi akhiran dengan sintaks baru.
type | null
Simbol pagar | memiliki arti OR logis dalam sintaks, membangun penyatuan dua set tipe yang terpisah: tipe dasar, dan referensi nullable. Ini adalah simbol sintaktis yang sama yang digunakan untuk mendeklarasikan beberapa kasus union diskriminatif F#: type AB = A | B membawa arti baik A, atau B.
Anotasi nullable | null dapat digunakan di semua tempat di mana jenis referensi biasanya digunakan:
- Bidang tipe gabungan, tipe rekaman, dan tipe khusus.
- Ketik alias ke jenis yang sudah ada.
- Ketik aplikasi dari jenis generik.
- Anotasi jenis eksplisit untuk memungkinkan pengikatan, parameter, atau jenis pengembalian.
- Ketik anotasi ke konstruksi pemrograman objek seperti anggota, properti, atau bidang.
type AB = A | B
type AbNull = AB | null
type RecordField = { X: string | null }
type TupleField = string * string | null
type NestedGenerics = { Z : List<List<string | null> | null> | null }
Simbol batang | memang memiliki penggunaan lain dalam F# yang mungkin menyebabkan ambiguitas sinonis. Dalam kasus seperti itu, tanda kurung diperlukan di sekitar jenis anotasi null:
// Unexpected symbol '|' (directly before 'null') in member definition
type DUField = N of string | null
Mengapit tipe yang sama ke dalam sepasang tanda kurung ( ) memperbaiki masalahnya.
type DUField = N of (string | null)
Saat digunakan dalam pencocokan pola, | digunakan untuk memisahkan klausa pencocokan pola yang berbeda.
match x with
| ?: string | null -> ...
Cuplikan ini sebenarnya setara dengan kode terlebih dahulu melakukan pengujian jenis terhadap jenis string, dan kemudian memiliki klausul terpisah untuk menangani null:
match x with
| ?: string
| null -> ...
Penting
Kemampuan terkait null tambahan ditambahkan ke bahasa untuk tujuan interoperabilitas. Menggunakan | null dalam pemodelan jenis F# tidak dianggap idiomatik untuk menunjukkan informasi yang hilang - untuk tujuan tersebut, gunakan opsi (seperti yang dijelaskan di atas). Baca selengkapnya tentang konvensi terkait null dalam panduan gaya.
Lihat juga
- Nilai
- Cocokkan Ekspresi