C# 4.0 | Dynamically Typed Objects

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.

Dynamic Keywords

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.

Runtime Lookup

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.

Keyword: object VS var VS dynamic

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.

object

Keyword object sebenarnya adalah cara penulisan pendek dari class System.Object.

image

Memang dengan deklarasi keyword object, kita bisa "seenaknya" memberi nilai seperti

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.

var

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.

image 

image image

Satu hal yang penting dan perlu diingat adalah var ini adalah strong-type. Anda akan mendapatkan error bila menulis seperti ini

image

dynamic

Bagaimana dengan keyword dynamic? Dynamic ini lain cerita lagi Sarcastic. 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.

   1: static void Main(string[] args)
   2: {
   3:     dynamic dyn;
   4:     dyn = "Ini variable dynamic";
   5:     dyn.Id = 10;
   6:     dyn.GoForward();
   7:     dyn = new { AccountId = "A001", Balance = 25000 };
   8: }

Sekilas, kelihatannya agak menakutkan Thinking, karna code tersebut tidak menyebabkan runtime error. Tetapi you'll see it at the runtime.

Share this post: | | | |
Published Tuesday, January 13, 2009 10:33 AM by Wely

Comments

# re: C# 4.0 | Dynamically Typed Objects

Sunday, December 14, 2008 6:35 AM by Agus S

that's right. dgn dynamic pemilihan tipe maupun member dilakukan pd saat runtime, yg tentu saja konsekuensinya runtime error.

# re: C# 4.0 | Dynamically Typed Objects

Sunday, December 14, 2008 6:45 AM by Agus S

sepertinya asyik juga tuh membaha co-variant dan contra-variant dgn bahasa yg mudah dimengerti oleh developer. next post?

# re: C# 4.0 | Dynamically Typed Objects

Sunday, December 14, 2008 7:09 AM by Wely

of course covariant and contravariant.

Nyusul nanti :)

# C# 4.0 | Optional and Named Parameter

Monday, December 29, 2008 8:43 PM by Wely

Bersambung dari post sebelumnya mengenai Dynamically Typed Objects pada C# 4.0 , kali ini saya ingin

# .NET Framework 4.0 Overview

Monday, April 13, 2009 9:57 PM by Wely

Dalam artikel ini saya akan mengajak teman2 mengintip sedikit tentang .NET Framework 4.0. Satu hal yang

# Twitter Trackbacks for C# 4.0 | Dynamically Typed Objects - Wely [netindonesia.net] on Topsy.com

Pingback from  Twitter Trackbacks for                 C# 4.0 | Dynamically Typed Objects - Wely         [netindonesia.net]        on Topsy.com

# C# 4.0 | Optional and Named Parameter

Wednesday, February 24, 2010 9:42 AM by Wely

Bersambung dari post sebelumnya mengenai Dynamically Typed Objects pada C# 4.0 , kali ini saya ingin

# Chrysler Atf Power Steering Fluid, Used 2003 Oldsmobile Alero Door Locks Power Mirrors

Pingback from  Chrysler Atf Power Steering Fluid, Used 2003 Oldsmobile Alero Door Locks Power Mirrors

# 04 Suzuki Reno Parts, Reno Nevada Grand Sierra Resort - 251.tgrconversions.com

Pingback from  04 Suzuki Reno Parts, Reno Nevada Grand Sierra Resort - 251.tgrconversions.com

# K2500 Suburban Part Home Depot Compressor Gmc Yukon, Toyota Y12 K2500 Suburban Aftermarket - 284.rkwrh.com

Pingback from  K2500 Suburban Part Home Depot Compressor Gmc Yukon, Toyota Y12 K2500 Suburban Aftermarket - 284.rkwrh.com

# 1989 - 1980 @ 760li Coupon Bmw 750li, 760li Executive - 44.computeronlinebingo.com

Pingback from  1989 - 1980 @ 760li Coupon Bmw 750li, 760li Executive - 44.computeronlinebingo.com

Powered by Community Server (Commercial Edition), by Telligent Systems