Kadang tipe data belum pasti saat kode ditulis: nilai bisa datang dari sumber luar dan bentuknya baru diketahui saat program berjalan. C# menyediakan dua tipe fleksibel untuk situasi tersebut: object dan dynamic. Keduanya menampung nilai tipe apa pun, tetapi kontrak pemeriksaannya berbeda total.
object: Induk Semua Tipe #
Setiap tipe di C# pada akhirnya mewarisi System.Object, yang aliasnya ditulis object. Konsekuensinya, satu variable object dapat menampung nilai tipe apa pun. Method GetType() melaporkan tipe asli nilai yang sedang ditampung:
object kotak1 = 42;
Console.WriteLine(kotak1);
Console.WriteLine(kotak1.GetType());
kotak1 = "Budi";
Console.WriteLine(kotak1);
Console.WriteLine(kotak1.GetType());Output yang Dihasilkan:
42
System.Int32
Budi
System.StringMari kita telaah baris demi baris:
- Baris 1 (
object kotak1 = 42;): Variableobjectmenampung nilai42milikint; proses pengemasan nilai value type ke dalam object dibahas khusus pada bab Boxing dan Unboxing. - Baris 3 (
kotak1.GetType()): Method bawaanobjectmelaporkan tipe asli saat runtime:System.Int32. - Baris 4 (
kotak1 = "Budi";): Variable yang sama kini menampung string; satu slotobjectboleh diganti dengan isi berbeda tipe. - Baris 6:
GetType()kini melaporkanSystem.String, sesuai isi terbaru.
Meski fleksibel, variable object membatasi operasi: compiler hanya mengizinkan operasi milik object itu sendiri. Mengambil kembali nilai dengan tipe aslinya memerlukan konversi eksplisit; mekanismenya dibahas pada bab Konversi Tipe dan Type Casting.
Karena semua tipe mewarisi object, properti dan method milik object dapat dipanggil pada nilai apa pun, antara lain GetType() dan ToString(). Method ToString() sudah kita manfaatkan secara tidak langsung sepanjang course ini: Console.WriteLine memanggil method tersebut untuk mengubah nilai menjadi teks sebelum dicetak ke terminal.
dynamic: Pemeriksaan Ditunda ke Runtime #
Tipe dynamic meminta compiler menunda pemeriksaan operasi hingga program berjalan. Operasi pada dynamic tidak dicek saat kompilasi; runtime yang menerapkannya sesuai tipe nilai sebenarnya:
dynamic data = 10;
Console.WriteLine(data * 2);
data = "Siti";
Console.WriteLine(data);Output yang Dihasilkan:
20
SitiBaris 2 dieksekusi saat data berisi 10, sehingga runtime melakukan perkalian dan menghasilkan 20. Setelah data diganti string, pencetakan pada baris terakhir tetap berjalan tanpa perubahan sintaks.
object vs dynamic #
| Aspek | object | dynamic |
|---|---|---|
| Pemeriksaan operasi | Saat kompilasi | Saat runtime |
Operasi non-object (mis. *) | Ditolak compiler | Dieksekusi runtime sesuai tipe sebenarnya |
| Kesalahan tipe terdeteksi | Sebelum program berjalan | Saat program berjalan |