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 #

csharp
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:

text
INV-001: 150000
INV-002: 82000
INV-001 Prioritas
INV-001: 200000
False
<>f__AnonymousType0`2

Mari kita bedah baris demi baris:

  1. new[] { ... }: array anonymous type sah bila seluruh elemen punya nama, tipe, dan urutan property yang sama, sehingga compiler membentuk satu tipe untuk keduanya.
  2. tertimbang: anonymous type bersarang menampung instance lain sebagai property; akses berantai seperti tertimbang.Pesanan.Kode tetap diperiksa compiler.
  3. pesanan[0] with { Total = 200000 }: sejak C# 9, anonymous type mendukung with; compiler menyalin seluruh property lalu menimpa yang disebutkan, sehingga pesanan[0] tidak berubah.
  4. koreksi == pesanan[0]: hasilnya False karena nilai Total keduanya berbeda; kesetaraan anonymous type membandingkan isi property satu per satu.
  5. 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.