Tuple menyimpan nilai berurutan tanpa nama tipe, sedangkan class menyimpan property bernama dengan tipe yang kita deklarasikan sendiri. Di antara keduanya ada kebutuhan ketiga: membentuk sekumpulan property bernama sekali pakai, tanpa mau menulis deklarasi tipe. Kata kunci new diikuti kurung kurawal menghasilkan anonymous type: compiler membuat tipe internal lengkap dengan property read-only, Equals, dan ToString, sementara nama tipenya tidak dapat kita tulis di source code.

Membentuk Tipe Sekali Pakai #

Contoh berikut membuat dua anonymous type dengan isi sama dan satu dengan isi berbeda, lalu membandingkan ketiganya:

csharp
var produk = new { Nama = "Kopi Gayo", Harga = 45000 };
var produkLain = new { Nama = "Kopi Gayo", Harga = 45000 };
var produkHargaBeda = new { Nama = "Kopi Gayo", Harga = 50000 };

Console.WriteLine(produk.Nama);
Console.WriteLine(produk.Harga);
Console.WriteLine(produk);
Console.WriteLine(produk == produkLain);
Console.WriteLine(produk.Equals(produkLain));
Console.WriteLine(produk.Equals(produkHargaBeda));
Console.WriteLine(produk.GetType().Name);

Output yang Dihasilkan:

text
Kopi Gayo
45000
{ Nama = Kopi Gayo, Harga = 45000 }
False
True
False
<>f__AnonymousType0`2

Mari kita bedah baris demi baris:

  1. var produk = new { Nama = "Kopi Gayo", Harga = 45000 };: compiler membuat tipe internal dengan dua property read-only bernama Nama dan Harga; kata kunci var wajib karena nama tipenya tidak tertulis.
  2. Console.WriteLine(produk): method ToString yang dibangkitkan menampilkan seluruh property beserta nilainya.
  3. produk == produkLain: operator == tidak dibangkitkan untuk anonymous type, sehingga perbandingan tetap menilai alamat object; hasilnya False meskipun isinya sama.
  4. produk.Equals(produkLain): method Equals membandingkan nilai seluruh property; dua anonymous type dianggap sama bila property, tipe, dan urutannya sama, sehingga hasilnya True.
  5. produk.Equals(produkHargaBeda): satu property berbeda membuat hasilnya False.
  6. produk.GetType().Name: nama yang dibangkitkan compiler adalah <>f__AnonymousType0`2; nama ini tidak sah sebagai identifier, itulah sebabnya tipe ini disebut anonymous.

Cakupan Penggunaan #

  • Anonymous type hanya hidup sebatas lingkup deklarasinya, paling pas untuk data sekali pakai di dalam satu method.
  • Variable wajib dideklarasikan dengan var karena nama tipenya tidak dapat ditulis.
  • Seluruh property bersifat read-only, sehingga isi anonymous type tidak dapat diubah setelah dibuat.
  • Sejak C# 10, anonymous type mendukung with expression; ekspresi produk with { Harga = 50000 } menghasilkan salinan baru dengan property yang ditimpa.
  • Tipe ini menjadi fondasi hasil proyeksi pada query LINQ yang dibahas pada bagian lanjutan course ini.