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:

csharp
object kotak1 = 42;
Console.WriteLine(kotak1);
Console.WriteLine(kotak1.GetType());

kotak1 = "Budi";
Console.WriteLine(kotak1);
Console.WriteLine(kotak1.GetType());

Output yang Dihasilkan:

text
42
System.Int32
Budi
System.String

Mari kita telaah baris demi baris:

  1. Baris 1 (object kotak1 = 42;): Variable object menampung nilai 42 milik int; proses pengemasan nilai value type ke dalam object dibahas khusus pada bab Boxing dan Unboxing.
  2. Baris 3 (kotak1.GetType()): Method bawaan object melaporkan tipe asli saat runtime: System.Int32.
  3. Baris 4 (kotak1 = "Budi";): Variable yang sama kini menampung string; satu slot object boleh diganti dengan isi berbeda tipe.
  4. Baris 6: GetType() kini melaporkan System.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:

csharp
dynamic data = 10;
Console.WriteLine(data * 2);

data = "Siti";
Console.WriteLine(data);

Output yang Dihasilkan:

text
20
Siti

Baris 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 #

Aspekobjectdynamic
Pemeriksaan operasiSaat kompilasiSaat runtime
Operasi non-object (mis. *)Ditolak compilerDieksekusi runtime sesuai tipe sebenarnya
Kesalahan tipe terdeteksiSebelum program berjalanSaat program berjalan