Section Variabel dan Tipe Data memperkenalkan dynamic sebagai tipe yang menunda pemeriksaan anggota hingga runtime. Bab ini menelusuri mekanisme di baliknya: apa yang dilakukan compiler pada setiap pemakaian dynamic, kapan RuntimeBinderException muncul, dan batasan mana yang sering mengejutkan. Pemahaman ini penting karena dinamis menggeser banyak galat dari waktu kompilasi ke waktu eksekusi.

Cara Kerja Runtime Binder #

Saat expression bertipe dynamic dieksekusi, compiler tidak mencari method atau property sama sekali. Kode tersebut diubah menjadi call site yang memanggil runtime binder dari Microsoft.CSharp, dan binder itulah yang mencari anggota berdasarkan tipe asli nilai saat program berjalan. Hasil pencarian di-cache per bentuk pemanggilan, tetapi keputusan tetap diambil saat eksekusi, sehingga kesalahan ejaan atau anggota yang tidak ada baru terlihat di runtime.

Contoh dan RuntimeBinderException #

csharp
dynamic teks = "Halo Dunia";
Console.WriteLine(teks.Length);
Console.WriteLine(teks.ToUpper());

dynamic angka = 8;
Console.WriteLine(angka * 3);

Cetak("satu dua tiga");

try
{
    dynamic salah = angka;
    Console.WriteLine(salah.Panggil());
}
catch (RuntimeBinderException ex)
{
    Console.WriteLine(ex.Message);
}

Output yang Dihasilkan:

text
10
HALO DUNIA
24
SATU DUA TIGA
'int' does not contain a definition for 'Panggil'

Mari kita bedah baris demi baris:

  1. teks.Length: binder menemukan Length milik string saat eksekusi; compiler tidak pernah memeriksa anggota ini.
  2. angka * 3: binder memilih operator perkalian int karena nilai aslinya int, sehingga hasilnya 24.
  3. Cetak("satu dua tiga"): parameter dynamic meneruskan sifat dynamic ke badan method; pemanggilan ToUpper di dalamnya tetap di-bind saat runtime.
  4. salah.Panggil(): runtime mencari Panggil pada int, tidak menemukannya, lalu melempar RuntimeBinderException dengan pesan asli di atas.

Batasan yang Perlu Diantisipasi #

  • Extension method tidak dapat di-dispatch secara dynamic. Pemanggilan seperti teks.Uji() pada variable dynamic berhasil dikompilasi, tetapi runtime melempar RuntimeBinderException dengan pesan 'string' does not contain a definition for 'Uji'.
  • Lambda dan anonymous method tidak boleh dijadikan argument dynamic, karena binder tidak memahami bentuk tersebut.
  • Setiap pemanggilan menanggung biaya pencarian anggota, jauh lebih besar dibanding pemanggilan biasa yang sudah disiapkan compiler.