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 #
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:
10
HALO DUNIA
24
SATU DUA TIGA
'int' does not contain a definition for 'Panggil'Mari kita bedah baris demi baris:
teks.Length: binder menemukanLengthmilikstringsaat eksekusi; compiler tidak pernah memeriksa anggota ini.angka * 3: binder memilih operator perkalianintkarena nilai aslinyaint, sehingga hasilnya24.Cetak("satu dua tiga"): parameterdynamicmeneruskan sifat dynamic ke badan method; pemanggilanToUpperdi dalamnya tetap di-bind saat runtime.salah.Panggil(): runtime mencariPanggilpadaint, tidak menemukannya, lalu melemparRuntimeBinderExceptiondengan 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 melemparRuntimeBinderExceptiondengan 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.