Pada post sebelumnya, saya telah menulis C# 4.0 secara overall. Pada post ini, saya akan membahas salah satu point penting pada C# 4.0, yaitu Dynamically Typed Object.
Point ini sering menjadi sebuah sumber perdebatan yang gak ada habisnya. Saya tidak akan memperdebatkan apakah lebih bagus strong type atau dynamic type.
Ok, let's start.
Pertama, suka gak suka, kenyataannya adalah bahwa "theme" pada C# 4.0 adalah dynamic programming. Hal ini juga telah diungkapkan oleh Anders Heljsberg pada presentasinya di PDC. Tetapi yang perlu kita ingat lagi bahwa dengan adanya "theme" dynamic pada C# 4.0, bukan berarti C# akan fully jadi dynamic language seperti python, ruby, etc.
C# pada dasarnya masih static / strong type, tapi yang unique adalah punya ability utk melakukan sesuatu secara dynamic. Jadi C# sekarang telah menjadi multi-paradigm dan juga multi-purpose language. Dengan penambahan feature dynamic, tidak berarti kita harus lupakan fungsionalitas C# sebelumnya, dan move ke dynamic semua. Tetapi yang penting adalah gunakan dynamic pada situasi dan saat yang tepat misalnya call COM Object, HTML DOM objects, call object dari dynamic language seperti Python atau Ruby, dll. Dengan adanya fitur dynamic, akan menjadi lebih mudah.
Pada C# 4.0, terdapat keyword baru yaitu dynamic. Ketika kita mendeklarasikan sebuah variable dengan keyword dynamic seperti
dynamic d;
Artinya kita memberitahukan kepada compiler bahwa variable d adalah sebuah dynamic variable, kita akan aware bahwa biarkanlah variable tersebut lolos dari compile time check, kita sudah sadar akan resiko terjadinya error pada saat runtime. Sehingga saya bisa tulis apa saja pada variable d tersebut.
Perhatikan contoh berikut.
1: static void Main(string[] args)
2: {
3: dynamic d = GetSomething();
4: d = 10;
5: d.CallAMethod();
6: d.SomeProperty = "fill with string";
7: d.CallAnotherMethod(20, "some parameter");
8: }
Kalau potongan code tersebut di compile pada compiler C# 3.0 ataupun sebelumnya, tentu saja compile time error. Tetapi pada C# 4.0, maka akan success pada compile time, tetapi apakah runtime akan terjadi error atau success? Jawabannya tergantung dengan method GetSomething();
Bila method GetSomething() ini membalikkan property dan method yang sesuai dengan apa yang dipanggil pada Main method, maka tentunya tidak terjadi error.
Jadi, sebenarnya apa yang dilakukan si compiler C# 4.0, ketika kita put the dynamic keyword? Compiler akan melihat sifat dari variable d, tentunya berdasarkan dari return type method GetSomething().
Bila ternyata GetSomething membalikkan COM Object, maka secara dynamic operation tersebut akan di-dispatch melalui COM IDispatch tanpa harus memiliki PIA (Primary Interop Assembly). Tentunya dengan fasilitas ini, sangat membantu.
Bila ternyata d mengimplementasikan interface IDynamicObject (IDynamicObject adalah bagian utama dari DLR - Dynamic Language Runtime pada .NET 4.0), tentunya d sendiri akan menjadi dynamic object, sehingga d sendiri akan melakukan operation nya sendiri tanpa campur tangan dan berinteraksi API lainnya. Implementasi seperti ini akan sering digunakan oleh dynamic language seperti IronPython dan IronRuby untuk mengimplementasikan object modelnya sendiri.
Selain dari itu, compiler mengasumsikan bahwa d adalah standard .NET object yang akan di-dispatch menggunakan reflection. Dengan singkat kata, meng-compile-nya secara static compiler.
Mungkin dengan munculnya keyword var pada C# 3.0 dan sekarang keyword dynamic pada C# 4.0, apa perbedaannya sesama dan juga dengan keyword object.
Keyword object sebenarnya adalah cara penulisan pendek dari class System.Object.
Memang dengan deklarasi keyword object, kita bisa "seenaknya" memberi nilai seperti
obj = 10; obj = "ini string";
obj = 10;
obj = "ini string";
dan lain sebagainya.
Tetapi ingat juga bahwa class object adalah reference type. Artinya ketika kita assign sebuah value type ke dalam variable tersebut, terjadilah Boxing. Mengingat Boxing dan UnBoxing akan memberikan impact pada performance, maka hindarilah sebisanya.
Keyword var ini bukan lah sebuah type seperti string, int, ataupun object. Keyword var ini hanyalah sebuah "simbol" yang mengatakan bahwa nilai dari variable ini bisa tergantung dari apa yang ada di right-hand side, dan itu harus diisi pada saat deklarasi awal. Selain itu juga untuk mendukung Anonymous Type pada C# 3.0.
Satu hal yang penting dan perlu diingat adalah var ini adalah strong-type. Anda akan mendapatkan error bila menulis seperti ini
Bagaimana dengan keyword dynamic? Dynamic ini lain cerita lagi . Ketika Anda mendeklarasikan variable tersebut dynamic, make sure kita aware atas resikonya.
Kenapa saya mengatakan begitu? Once you put the dynamic keyword, compiler akan lepas tangan untuk memeriksa compile time check, sehingga ada potensi untuk terjadinya error pada runtime.
Berbeda dengan var yang harus didefinisikan nilainya pada awal, Anda bisa membiarkannya kosong pada saat awal sekalipun.
3: dynamic dyn;
4: dyn = "Ini variable dynamic";
5: dyn.Id = 10;
6: dyn.GoForward();
7: dyn = new { AccountId = "A001", Balance = 25000 };
Sekilas, kelihatannya agak menakutkan , karna code tersebut tidak menyebabkan runtime error. Tetapi you'll see it at the runtime.
that's right. dgn dynamic pemilihan tipe maupun member dilakukan pd saat runtime, yg tentu saja konsekuensinya runtime error.
sepertinya asyik juga tuh membaha co-variant dan contra-variant dgn bahasa yg mudah dimengerti oleh developer. next post?
of course covariant and contravariant.
Nyusul nanti :)
Bersambung dari post sebelumnya mengenai Dynamically Typed Objects pada C# 4.0 , kali ini saya ingin
Dalam artikel ini saya akan mengajak teman2 mengintip sedikit tentang .NET Framework 4.0. Satu hal yang
Pingback from Twitter Trackbacks for C# 4.0 | Dynamically Typed Objects - Wely [netindonesia.net] on Topsy.com
Pingback from Chrysler Atf Power Steering Fluid, Used 2003 Oldsmobile Alero Door Locks Power Mirrors
Pingback from 04 Suzuki Reno Parts, Reno Nevada Grand Sierra Resort - 251.tgrconversions.com
Pingback from K2500 Suburban Part Home Depot Compressor Gmc Yukon, Toyota Y12 K2500 Suburban Aftermarket - 284.rkwrh.com
Pingback from 1989 - 1980 @ 760li Coupon Bmw 750li, 760li Executive - 44.computeronlinebingo.com