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:
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:
Kopi Gayo
45000
{ Nama = Kopi Gayo, Harga = 45000 }
False
True
False
<>f__AnonymousType0`2Mari kita bedah baris demi baris:
var produk = new { Nama = "Kopi Gayo", Harga = 45000 };: compiler membuat tipe internal dengan dua property read-only bernamaNamadanHarga; kata kuncivarwajib karena nama tipenya tidak tertulis.Console.WriteLine(produk): methodToStringyang dibangkitkan menampilkan seluruh property beserta nilainya.produk == produkLain: operator==tidak dibangkitkan untuk anonymous type, sehingga perbandingan tetap menilai alamat object; hasilnyaFalsemeskipun isinya sama.produk.Equals(produkLain): methodEqualsmembandingkan nilai seluruh property; dua anonymous type dianggap sama bila property, tipe, dan urutannya sama, sehingga hasilnyaTrue.produk.Equals(produkHargaBeda): satu property berbeda membuat hasilnyaFalse.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
varkarena 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.