Tidak semua method membutuhkan seluruh datanya dari pemanggil. Tiket kereta biasanya berjumlah satu penumpang di kelas reguler, sehingga memaksa pemanggil menulis Tiket.HitungBiaya(100000, 1, false) untuk kasus paling umum terasa berlebihan. C# menyediakan optional parameter: parameter yang diberi nilai default dan boleh dilewati saat pemanggilan.

Aturan Nilai Default #

Parameter menjadi optional ketika deklarasinya diberi nilai default dengan tanda =. Tiga aturan yang harus dipatuhi:

  1. Parameter optional ditulis tipe nama = nilaiDefault, misalnya int jumlahPenumpang = 1.
  2. Parameter optional harus berada setelah semua parameter wajib.
  3. Nilai default harus berupa konstanta yang diketahui saat kompilasi, seperti angka, string literal, true/false, atau null.

Contoh Lengkap #

csharp
static class Tiket
{
    public static int HitungBiaya(int hargaDasar, int jumlahPenumpang = 1, bool kelasEksekutif = false)
    {
        int biaya = hargaDasar * jumlahPenumpang;
        if (kelasEksekutif)
        {
            biaya += 50000 * jumlahPenumpang;
        }
        return biaya;
    }
}

int biayaSolo = Tiket.HitungBiaya(100000);
int biayaGrup = Tiket.HitungBiaya(100000, 3);
int biayaEksekutif = Tiket.HitungBiaya(100000, 2, true);
Console.WriteLine($"Solo: {biayaSolo}");
Console.WriteLine($"Grup 3 penumpang: {biayaGrup}");
Console.WriteLine($"Grup 2 eksekutif: {biayaEksekutif}");

Output yang Dihasilkan:

text
Solo: 100000
Grup 3 penumpang: 300000
Grup 2 eksekutif: 300000

Mari kita bedah tiga panggilan tersebut:

  1. Baris 14 (HitungBiaya(100000)): hanya parameter wajib hargaDasar yang diisi; jumlahPenumpang memakai default 1 dan kelasEksekutif memakai default false, sehingga biaya tetap 100000.
  2. Baris 15 (HitungBiaya(100000, 3)): argument 3 mengisi jumlahPenumpang secara posisi; kelasEksekutif tetap false, sehingga biaya menjadi 300000.
  3. Baris 16 (HitungBiaya(100000, 2, true)): semua parameter terisi; tambahan kelas eksekutif 50000 * 2 membuat total menjadi 300000.

Panggilan pertama menunjukkan manfaat utamanya: pemanggil menulis hanya data yang berbeda dari kebiasaan, dan sisanya diserahkan ke default.

Di balik layar, compiler yang menyelipkan nilai default: pemanggilan yang melewati parameter optional dikompilasi seolah-olah nilai default dikirim secara eksplisit. Perilaku inilah alasan default harus konstanta — nilai itu ditempelkan pada titik panggilan, bukan dihitung ulang oleh method.

Memilih Nilai Default #

Nilai default sebaiknya benar-benar mewakili kebiasaan paling umum, bukan sekadar nilai aman seperti nol. Pada method HitungBiaya, angka 1 dan false dipilih karena tiket solo kelas reguler memang kasus yang paling sering terjadi. Bila kebiasaan berubah, cukup satu baris default yang disesuaikan, dan seluruh pemanggil yang melewatinya ikut berperilaku baru.

Batasan yang Perlu Diketahui #

Optional parameter tidak bisa dilewati satu per satu di tengah. Kita tidak dapat mengisi kelasEksekutif secara posisi tanpa mengisi jumlahPenumpang terlebih dahulu, karena isi argument selalu dipetakan berurutan dari kiri. Solusinya ada pada bab Named Arguments.