Bab Anonymous Types pada section Struct, Record, dan Enum memperkenalkan anonymous type sebagai sekumpulan property bernama yang dibentuk compiler sekali pakai. Bab ini melanjutkan ke penggunaan yang lebih luas: array yang berisi anonymous type, tipe bersarang di dalam tipe lain, dan with-expression yang menyalin instance dengan sebagian nilai diganti. Ketiganya sering muncul saat kita menyusun data tampilan sementara.
Array, Sarang, dan with #
var pesanan = new[]
{
new { Kode = "INV-001", Total = 150000 },
new { Kode = "INV-002", Total = 82000 }
};
foreach (var p in pesanan)
{
Console.WriteLine($"{p.Kode}: {p.Total}");
}
var tertimbang = new { Pesanan = pesanan[0], Catatan = "Prioritas" };
Console.WriteLine($"{tertimbang.Pesanan.Kode} {tertimbang.Catatan}");
var koreksi = pesanan[0] with { Total = 200000 };
Console.WriteLine($"{koreksi.Kode}: {koreksi.Total}");
Console.WriteLine(koreksi == pesanan[0]);
Console.WriteLine(pesanan[0].GetType().Name);Output yang Dihasilkan:
INV-001: 150000
INV-002: 82000
INV-001 Prioritas
INV-001: 200000
False
<>f__AnonymousType0`2Mari kita bedah baris demi baris:
new[] { ... }: array anonymous type sah bila seluruh elemen punya nama, tipe, dan urutan property yang sama, sehingga compiler membentuk satu tipe untuk keduanya.tertimbang: anonymous type bersarang menampung instance lain sebagai property; akses berantai sepertitertimbang.Pesanan.Kodetetap diperiksa compiler.pesanan[0] with { Total = 200000 }: sejak C# 9, anonymous type mendukungwith; compiler menyalin seluruh property lalu menimpa yang disebutkan, sehinggapesanan[0]tidak berubah.koreksi == pesanan[0]: hasilnyaFalsekarena nilaiTotalkeduanya berbeda; kesetaraan anonymous type membandingkan isi property satu per satu.GetType().Name: nama asli tipe berupa<>f__AnonymousType0`2, nama internal yang tidak dapat kita tulis di source code.
Batasan sebagai Tipe Antar Method #
Anonymous type hanya dapat dinyatakan lewat var di dalam blok tempat instance dibuat. Method tidak boleh mengembalikannya dengan tipe eksplisit, karena namanya tidak dapat ditulis; opsi seperti mengembalikan object justru menghilangkan pemeriksaan tipe. Ketika data perlu menyeberang method atau disimpan, tipe bernama seperti record adalah pilihan yang benar, sedangkan anonymous type tetap unggul untuk proyeksi sekali pakai di dalam satu method, misalnya pola select new { ... } yang dibahas pada section LINQ.