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.
JenisT? nilai nullable mewakili semua nilai dari jenisdan nilai nullT. Sebagai contoh, Anda dapat menetapkan salah satu dari tiga nilai berikut ke variabel bool?: true, false, atau null. Jenis T nilai yang mendasar tidak boleh berupa jenis nilai nullable itu sendiri.
Referensi bahasa C# mendanai versi bahasa C# yang terbaru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.
Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.
Tip
Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.
Jenis nilai yang dapat diubah ke null adalah instans struktur generik System.Nullable<T>. Anda bisa merujuk ke jenis nilai yang dapat diubah ke null dengan jenis T yang mendasar dalam salah satu bentuk yang dapat dipertukarkan berikut: Nullable<T> atau T?.
Biasanya, gunakan jenis nilai nullable saat Anda perlu mewakili nilai yang tidak ditentukan dari jenis nilai yang mendasar. Misalnya, variabel Boolean, atau bool, hanya dapat berupa true atau false. Namun, dalam beberapa aplikasi nilai variabel dapat tidak terdefinisi atau hilang. Misalnya, bidang database mungkin berisi true atau false, atau mungkin tidak berisi nilai sekali, yaitu, NULL. Anda bisa menggunakan jenis bool? dalam skenario tersebut.
Deklarasi dan penugasan
Karena jenis nilai secara implisit dapat dikonversi ke jenis nilai nullable yang sesuai, Anda dapat menetapkan nilai ke variabel jenis nilai nullable seperti yang Anda lakukan untuk jenis nilai yang mendasarnya. Anda juga dapat menetapkan nilai null. Contohnya:
double? pi = 3.14;
char? letter = 'a';
int m2 = 10;
int? m = m2;
bool? flag = null;
// An array of a nullable value type:
int?[] arr = new int?[10];
Nilai default dari jenis nilai nullable mewakili null. Ini adalah instans falseyang propertinya Nullable<T>.HasValue mengembalikan .
Pemeriksaan instans jenis nilai yang dapat diubah ke null
Untuk memeriksa instans jenis nilai nullable untuk null dan mendapatkan nilai dari jenis yang mendasar, gunakan is operator dengan pola jenis:
int? a = 42;
if (a is int valueOfA)
{
Console.WriteLine($"a is {valueOfA}");
}
else
{
Console.WriteLine("a does not have a value");
}
// Output:
// a is 42
Anda selalu dapat menggunakan properti baca-saja berikut untuk memeriksa dan mendapatkan nilai variabel jenis nilai yang dapat diubah ke null:
Nullable<T>.HasValue menunjukkan apakah instans jenis nilai yang dapat diubah ke null memiliki nilai dari jenis yang mendasarnya.
Nullable<T>.Value mendapatkan nilai dari jenis yang mendasar jika HasValue adalah
true. Jika HasValue adalahfalse, Value properti melempar InvalidOperationException.
Contoh berikut menggunakan HasValue properti untuk memeriksa apakah variabel berisi nilai sebelum menampilkannya:
int? b = 10;
if (b.HasValue)
{
Console.WriteLine($"b is {b.Value}");
}
else
{
Console.WriteLine("b does not have a value");
}
// Output:
// b is 10
Anda juga dapat membandingkan variabel jenis nilai yang dapat diubah ke null dengan null alih-alih menggunakan properti HasValue, seperti yang ditunjukkan contoh berikut:
int? c = 7;
if (c != null)
{
Console.WriteLine($"c is {c.Value}");
}
else
{
Console.WriteLine("c does not have a value");
}
// Output:
// c is 7
Konversi dari jenis nilai yang dapat diubah ke tipe yang mendasar
Jika Anda ingin menetapkan nilai jenis nilai nullable ke variabel jenis nilai yang tidak dapat diubah ke null, Anda mungkin perlu menentukan nilai yang akan ditetapkan sebagai pengganti null. Gunakan operator ??null-coalescing untuk melakukannya. Anda juga dapat menggunakan metode untuk Nullable<T>.GetValueOrDefault(T) tujuan yang sama:
int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}"); // output: b is 28
int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}"); // output: d is -1
Jika Anda ingin menggunakan nilai default dari jenis nilai yang mendasar sebagai ganti null, gunakan metode Nullable<T>.GetValueOrDefault().
Anda juga dapat secara eksplisit melemparkan tipe nilai yang dapat diubah ke null ke tipe yang tidak dapat dibatalkan, seperti yang ditunjukkan oleh contoh berikut:
int? n = null;
//int m1 = n; // Doesn't compile
int n2 = (int)n; // Compiles, but throws an exception if n is null
Pada durasi, jika nilai jenis nilai yang dapat diubah ke null adalah null, transmisi eksplisit akan melemparkan InvalidOperationException.
Jenis nilai T yang tidak dapat diubah ke null secara implisit dapat dikonversi ke jenis nilai yang dapat diubah ke null T? yang sesuai.
Operator yang terangkat
Jenis T? nilai nullable mendukung operator unary dan biner yang telah ditentukan sebelumnya atau operator yang kelebihan beban yang didukung jenis T nilai. Operator ini, juga dikenal sebagai operator yang diangkat, kembali null jika satu atau kedua operan adalah null. Jika tidak, operator menggunakan nilai yang terkandung dari operand-nya untuk menghitung hasilnya. Contohnya:
int? a = 10;
int? b = null;
int? c = 10;
a++; // a is 11
a = a * c; // a is 110
a = a + b; // a is null
Catatan
Untuk jenisnyabool?, operator dan & yang telah ditentukan | sebelumnya tidak mengikuti aturan yang dijelaskan di bagian ini: hasil evaluasi operator bisa non-null meskipun salah satu operan adalah null. Untuk informasi selengkapnya, lihat bagian Operator logis Boolean yang dapat diubah ke null dari artikel Operator logis Boolean .
Untuk operator perbandingan<, >, , <=dan >=, jika satu atau kedua operand adalah null, hasilnya adalah false. Jika tidak, nilai operand yang terkandung dibandingkan. Jangan berasumsi bahwa karena perbandingan tertentu (misalnya, <=) mengembalikan false, perbandingan yang berlawanan (>) mengembalikan true. Contoh berikut ini menunjukkan bahwa 10 adalah
- Lebih dari atau sama dengan
null - kurang dari
null
int? a = 10;
Console.WriteLine($"{a} >= null is {a >= null}");
Console.WriteLine($"{a} < null is {a < null}");
Console.WriteLine($"{a} == null is {a == null}");
// Output:
// 10 >= null is False
// 10 < null is False
// 10 == null is False
int? b = null;
int? c = null;
Console.WriteLine($"null >= null is {b >= c}");
Console.WriteLine($"null == null is {b == c}");
// Output:
// null >= null is False
// null == null is True
Untuk operator ==kesetaraan, jika kedua operan adalah null, hasilnya adalah true. Jika hanya salah satu operand adalah null, hasilnya adalah false. Jika tidak, nilai operand yang terkandung dibandingkan.
Untuk operator !=ketidaksamaan, jika kedua operand adalah null, hasilnya adalah false. Jika hanya salah satu operand adalah null, hasilnya adalah true. Jika tidak, nilai operand yang terkandung dibandingkan.
Jika konversi yang ditentukan pengguna ada di antara dua jenis nilai, konversi yang sama juga dapat digunakan di antara jenis nilai nullable yang sesuai.
Boxing dan Unboxing
Aturan berikut berlaku saat Anda mengetikkan instans jenis T?nilai nullable :
- Jika HasValue mengembalikan
false, operasi tinju mengembalikan referensi null. - Jika HasValue mengembalikan , operasi tinju kotak nilai yang sesuai dari jenis
Tnilai yang mendasartrue, bukan instans .Nullable<T>
Anda bisa membuka kotak nilai berjenis nilai T ke jenis nilai nullable terkait T?, seperti yang ditunjukkan contoh berikut:
int a = 41;
object aBoxed = a;
int? aNullable = (int?)aBoxed;
Console.WriteLine($"Value of aNullable: {aNullable}");
object aNullableBoxed = aNullable;
if (aNullableBoxed is int valueOfA)
{
Console.WriteLine($"aNullableBoxed is boxed int: {valueOfA}");
}
// Output:
// Value of aNullable: 41
// aNullableBoxed is boxed int: 41
Cara mengidentifikasi jenis nilai yang dapat diubah ke null
Contoh berikut menunjukkan cara menentukan apakah System.Type instans mewakili jenis nilai nullable yang dibangun, yaitu jenis System.Nullable<T> dengan parameter Tjenis tertentu :
Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} value type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non-nullable")} value type");
bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;
// Output:
// int? is nullable value type
// int is non-nullable value type
Seperti yang ditunjukkan contoh, Anda menggunakan operator typeof untuk membuat System.Type instans.
Jika Anda ingin menentukan apakah instans memiliki jenis nilai nullable, jangan gunakan Object.GetType metode untuk mendapatkan Type instans untuk diuji dengan menggunakan kode sebelumnya. Saat Anda memanggil Object.GetType metode pada instans jenis nilai nullable, instans dikotak ke Object. Karena tinju instans non-null dari jenis nilai nullable setara dengan tinju nilai dari jenis yang mendasar, GetType mengembalikan instans Type yang mewakili jenis yang mendasar dari jenis nilai nullable:
int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32
Selain itu, jangan gunakan operator is untuk menentukan apakah instans adalah jenis nilai yang dapat diubah ke null. Seperti yang ditunjukkan contoh berikut, Anda tidak dapat membedakan jenis instans jenis nilai yang dapat diubah ke null dan instans jenis yang mendasarnya dengan menggunakan is operator:
int? a = 14;
if (a is int)
{
Console.WriteLine("int? instance is compatible with int");
}
int b = 17;
if (b is int?)
{
Console.WriteLine("int instance is compatible with int?");
}
// Output:
// int? instance is compatible with int
// int instance is compatible with int?
Sebagai gantinya Nullable.GetUnderlyingType , gunakan metode dari contoh pertama dan operator typeof untuk memeriksa apakah instans memiliki jenis nilai nullable.
Catatan
Metode yang dijelaskan di bagian ini tidak berlaku untuk jenis referensi nullable.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
- Jenis yang dapat diubah ke null
- Operator yang terangkat
- Konversi implisit yang dapat diubah ke null
- Konversi yang dapat diubah ke null eksplisit
- Operator yang terangkat