Keamanan null pada C#

Tip

Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang sudah mengetahui setidaknya satu bahasa pemrograman dan mempelajari C#. Jika Anda baru menggunakan pemrograman, mulailah dengan tutorial Memulai terlebih dahulu.

Berasal dari Java atau C++? C# menyediakan keamanan null pada waktu kompilasi melalui tipe referensi yang dapat bernilai null. Tujuannya mirip dengan anotasi @NonNull Java tetapi diberlakukan oleh kompilator. C# juga memiliki operator khusus seperti ?. dan ?? yang membuat ekspresi null-safe ringkas.

null mewakili tidak adanya nilai. Ketika Anda mencoba mengakses anggota pada referensi null, dengan memanggil metode atau membaca properti, runtime melempar: NullReferenceException

// Accessing a member on null throws NullReferenceException at runtime:
// string? name = null;
// int length = name.Length; // throws NullReferenceException

// Check before you dereference:
string? name = null;
if (name is not null)
{
    Console.WriteLine($"Name has {name.Length} characters.");
}
else
{
    Console.WriteLine("Name has no value.");
}
// Output: Name has no value.

C# memberi Anda tiga alat pelengkap untuk menulis kode null-safe:

  • Jenis Nilai Nullable: biarkan jenis nilai seperti int atau bool juga memuat null
  • Jenis referensi yang dapat diubah ke null: biarkan pengkompilasi melacak apakah referensi mungkin null
  • Operator null: memungkinkan akses null-safe dan logika fallback secara ringkas

Jenis nilai yang dapat diubah ke null

Jenis nilai seperti int, double, dan bool tidak dapat menampung null secara default. Tambahkan ? ke nama tipe untuk membuat tipe nilai nullable yang menyimpan nilai atau null:

int? score = null;
Console.WriteLine(score.HasValue);               // False

score = 95;
Console.WriteLine(score.HasValue);               // True
Console.WriteLine(score.GetValueOrDefault());    // 95

int? missing = null;
Console.WriteLine(missing.GetValueOrDefault(-1)); // -1

Jenis nilai dapat bernilai null berguna ketika tipe data dasar harus merepresentasikan "tidak ada data". Skenario umum termasuk kolom database yang mungkin tidak hadir, pengaturan konfigurasi opsional, dan pengambilan data sensor yang belum dilakukan.

Untuk cakupan lengkap deklarasi, pemeriksaan, dan konversi, lihat Jenis nilai yang dapat diubah ke null.

Jenis referensi yang bisa memiliki nilai null

Jenis referensi, seperti string, array, dan instans kelas, dapat menampung null pada runtime. Tipe referensi nullable adalah fitur kompilator yang membuat maksud null menjadi eksplisit dan menangkap kesalahan pada waktu kompilasi.

Dengan menggunakan ? anotasi, Anda menyatakan niat Anda:

  • string? — referensi ini mungkinnull; pengkompilasi memperingatkan jika Anda mendereferensikannya tanpa memeriksa terlebih dahulu
  • string— referensi ini seharusnya tidaknull; pengompiler akan memperingatkan jika Anda memberikan null kepadanya
// string?  means this reference might be null
// string   means this reference should not be null
string? nullableName = null;
string  nonNullName  = "Alice";

// ?. safely accesses a member when the reference might be null
string display = nullableName?.ToUpper() ?? "(no name)";
Console.WriteLine(display);         // (no name)

display = nonNullName.ToUpper();    // safe: nonNullName is never null
Console.WriteLine(display);         // ALICE

Semua proyek .NET yang dibuat oleh templat SDK modern akan mengaktifkan jenis referensi nullable secara default. Untuk panduan lengkap tentang mengaktifkan dan melakukan anotasi, lihat Jenis referensi nullable.

Operator null

C# mencakup beberapa operator yang memungkinkan Anda menulis kode null-safe tanpa pelindung null manual di mana-mana.

Pengendali Name Kegunaan
?. Pengaksesan anggota bersyarat null Mengakses anggota hanya ketika objek bukan nol
?[] Akses pengindeks kondisional-null Akses elemen hanya jika koleksi tidak bernilai null
?? Operator penggabungan null Mengembalikan nilai fallback saat ekspresi null
??= Penetapan penggabungan-null Tetapkan hanya ketika variabel adalah null
is null / is not null Pola kosong Uji null yang diutamakan
string? city = GetCity();

// ?. — access a member only when non-null
int? len = city?.Length;

// ?? — substitute a default when null
string display = city ?? "unknown";

// is null — preferred null test
if (city is null)
{
    Console.WriteLine("No city provided.");
}
else
{
    Console.WriteLine($"{display} ({len} chars)");
}
// Output: No city provided.

Untuk contoh terperinci dari setiap operator, lihat Operator null.

Jenis nilai nullable dan jenis referensi nullable memiliki fungsi berbeda

Jenis nilai nullable dan jenis referensi nullable bukan alternatif. Mereka memecahkan masalah yang berbeda:

  • Gunakan T? untuk jenis nilai yang perlu mewakili "tanpa nilai." Misalnya, gunakan int? untuk kolom database opsional atau DateTime? untuk peristiwa yang belum dijadwalkan.
  • Gunakan string? dan anotasi referensi null lainnya untuk mendokumen bahwa referensi mungkinnull, sehingga pengompilasi dapat memperingatkan Anda sebelum NullReferenceException terjadi pada runtime.

Bersama-sama, fitur-fitur ini dan operator null memberi Anda serangkaian alat lengkap untuk menulis kode C# null-safe.