Type pattern menguji tipe runtime sebuah nilai lalu mengikat nilainya ke variabel baru yang bertipe itu. Bab Pattern Matching Dasar sudah menunjukkan bentuk is int angka; bab ini fokus pada pemanfaatannya di switch expression: urutan arm, perilaku terhadap tipe turunan, dan arm yang menerima nilai campuran dari katalog.
Mekanisme Uji Tipe dan Binding #
Pola T x cocok bila tipe runtime input adalah T atau turunan dari T; saat cocok, input terikat ke x yang hanya terlihat di arm tersebut. Bila input null, type pattern untuk tipe referensi tidak cocok, sehingga arm null atau discard yang menangkapnya. Variabel binding tidak menyalin data; ia menunjuk object yang sama dengan tipe yang lebih spesifik.
Contoh: Katalog Campuran #
public record Produk(string Nama);
public record Layanan(string Nama, int DurasiJam);
string Deskripsikan(object item) => item switch
{
Produk p => $"Produk: {p.Nama}",
Layanan l => $"Layanan {l.Nama} ({l.DurasiJam} jam)",
string s => $"Teks promosi: {s}",
int angka => $"Kode angka: {angka}",
_ => "Item tidak dikenal"
};
Console.WriteLine(Deskripsikan(new Produk("Kopi Gayo")));
Console.WriteLine(Deskripsikan(new Layanan("Instalasi Mesin", 3)));
Console.WriteLine(Deskripsikan("Diskon Akhir Tahun"));
Console.WriteLine(Deskripsikan(88));
Console.WriteLine(Deskripsikan(2.5));Output yang Dihasilkan:
Produk: Kopi Gayo
Layanan Instalasi Mesin (3 jam)
Teks promosi: Diskon Akhir Tahun
Kode angka: 88
Item tidak ditemukanMari kita bedah baris demi baris:
object itemsebagai parameter: Tipe statisobjectmenyembunyikan tipe asli, sehingga switch expression wajib menguji tipe runtime lewat pola.Produk p => ...: RecordProdukcocok pada arm pertama; bindingpmembawa anggotaNamayang bisa langsung dipakai di hasil.Layanan l => ...: Arm kedua menguji record berbeda; pencocokan tipe memastikanDurasiJamhanya diakses pada object yang memang memilikinya.string sdanint angka: Pola tipe bawaan bekerja sama seperti pola tipe buatan kita; setiap arm mengikat nama variabelnya sendiri.Deskripsikan(2.5): Nilaidoubletidak cocok dengan empat type pattern di atas, sehingga jatuh ke arm discard dan menghasilkan teks tidak dikenal.
Urutan Arm Menentukan Hasil #
Arm dievaluasi berurutan dan arm pertama yang cocok menang, sehingga arm tipe yang lebih spesifik harus diletakkan sebelum arm base class-nya. Pola Produk p juga cocok untuk record apa pun yang mewarisi Produk; bila suatu saat ada ProdukDigital : Produk, arm turunan harus berada di atas arm induk agar tercapai.