Ringkasan pencocokan pola

Tip

Artikel ini adalah bagian dari bagian Dasar-Dasar untuk pengembang yang sudah mengetahui setidaknya satu bahasa pemrograman dan mempelajari C#. Jika Anda baru menggunakan pemrograman, mulailah dengan tutorial Memulai terlebih dahulu. Pengembang C# berpengalaman dapat menggunakan referensi pola untuk sintaks dan aturan lengkap.

Berasal dari bahasa lain? Pola C# menyajikan peran yang mirip dengan pencocokan pola Java dan kasus Pythonmatch. C# menggunakan pola dalam is ekspresi, switch pernyataan, dan switch ekspresi.

Pencocokan pola menerapkan suatu pola pada ekspresi. Pola adalah kondisi untuk menguji apakah ekspresi masukan cocok dengannya. Masukan pola adalah ekspresi tersebut. C# mengevaluasi ekspresi input; hasilnya adalah nilai yang dievaluasi. Pola menguji apakah nilai tersebut memiliki jenis tertentu, sama dengan nilai tertentu, atau memiliki bentuk tertentu. Saat pola cocok, kode Anda dapat menggunakan informasi yang dipelajari oleh pengujian, seperti jenis yang lebih spesifik atau nilai yang diekstrak dari objek.

Anda dapat menggunakan pola dalam tiga konteks:

  • Di sisi kanan operator is.
  • Dalam label case dari pernyataan switch.
  • Dalam salah satu cabang ekspresi switch.

Pola sering lebih jelas daripada urutan pernyataan perbandingan karena setiap cabang menjelaskan data yang ditanganinya. Misalnya, metode berikut menggunakan switch ekspresi untuk memilih pesan pengiriman:

static string GetDeliveryMessage(Delivery? delivery) =>
    delivery switch
    {
        null => "No delivery was scheduled.",
        ExpressDelivery express => $"Express package {express.TrackingCode}",
        StandardDelivery { Days: <= 2 } => "Standard delivery arriving soon",
        _ => "Standard delivery"
    };

Pola rekursif memiliki ekspresi inputnya sendiri. Dalam StandardDelivery { Days: <= 2 }, pola luar menerima ekspresi delivery. Pola rekursif <= 2 menerima ekspresi properti Days dari objek StandardDelivery yang cocok.

Ekspresi sebelumnya switch adalah ekspresi input. Setiap garis di dalam kurung kurawal adalah lengan sakelar. Pola muncul sebelum =>, dan hasilnya muncul setelahnya. C# mengevaluasi ekspresi input, lalu memilih lengan pertama, dalam urutan teks, yang polanya cocok dan yang penjaga opsionalnya when adalah true. Guard opsional when adalah kondisi Boolean tambahan yang ditulis setelah pola. Contoh sebelumnya menunjukkan pola berikut:

  • null adalah pola konstan. Menguji apakah ekspresi delivery bernilai null.
  • ExpressDelivery express adalah pola deklarasi dengan dua bagian. ExpressDelivery adalah bagian pengujian tipe. Ini menguji apakah nilai yang dievaluasi adalah objek non-null yang jenis run-time-nya kompatibel dengan ExpressDelivery. express adalah penentuan variabel: ini mendeklarasikan variabel bernama ExpressDelivery dan menetapkan objek express yang cocok ke variabel tersebut.
  • StandardDelivery { Days: <= 2 } dimulai dengan pengujian tipe. StandardDelivery menguji apakah nilai yang dievaluasi adalah objek non-null dari jenis tersebut. Tanda kurung kurawal berisi pola properti. Days memberi nama properti untuk diperiksa, sehingga Days ekspresi properti menjadi input ke pola rekursif. Bagiannya <= 2 adalah pola relasional, yang menguji apakah nilai yang dievaluasi kurang dari atau sama dengan 2.
  • _ (garis bawah) adalah pola buang. Ini cocok dengan setiap nilai yang dievaluasi, termasuk null. Karena lengan sebelumnya sudah menangani null, pengiriman ekspres, dan pengiriman standar yang tiba dalam dua hari, lengan akhir ini menangani setiap nilai yang tersisa.

Lengan tanpa when pelindung adalah tanpa pelindung. Semua lengan pada contoh pertama tidak memiliki pengaman. Jika lengan yang tidak dijaga sebelumnya cocok dengan setiap nilai yang dievaluasi yang dapat dicocokkan dengan lengan selanjutnya, lengan selanjutnya akan disubsumsi. Pola tercakup adalah pola yang setiap kemungkinan nilai masukannya yang sesuai sudah dicocokkan oleh cabang switch sebelumnya. Ini tidak pernah bisa cocok, sehingga pengkompilasi melaporkan kesalahan. Cabang discard (_) harus berada di urutan terakhir karena cocok dengan setiap ekspresi input. Lengan yang dijaga tidak meredakan lengan selanjutnya berdasarkan polanya saja karena penjaga mungkin false.

Ekspresi switch bersifat mencakup semua kemungkinan ketika cabang-cabangnya menangani setiap ekspresi masukan yang mungkin. Contoh pertama lengkap karena lengan buang terakhirnya menangani apa pun yang tidak cocok dengan lengan sebelumnya. Pengkompilasi memperingatkan ketika mendeteksi nilai input potensial yang tidak ada handel lengan. Kompiler tidak dapat membuktikan bahwa semua kemungkinan kasus telah tercakup untuk setiap kombinasi pola, tetapi diagnostik ini membantu Anda menulis kode pencocokan pola yang benar. Untuk aturan terperinci tentang pencocokan, subsumsi, dan kelengkapan, lihat referensi pola.

Uji satu kondisi dengan is

is Gunakan operator saat Anda memerlukan satu tes Boolean. Kode berikut mengevaluasi ekspresi delivery dan menerapkan pola deklarasi ExpressDelivery express. Bagian tipe cocok ketika nilai yang dievaluasi bernilai non-null dan tipe run-time-nya kompatibel dengan ExpressDelivery. Ketika pola cocok, penunjukan variabelnya menyatakan express:

static void PrintTrackingCode(Delivery delivery)
{
    if (delivery is ExpressDelivery express)
    {
        Console.WriteLine($"Track express package {express.TrackingCode}");
    }
}

Pengkompilasi melacak apakah variabel lokal telah ditetapkan sebelum kode Anda membacanya. Pelacakan ini disebut penugasan definitif. Di dalam blok if, kondisi hanya dapat berupa true ketika pola menetapkan objek yang cocok ke express. Oleh karena itu pengkompilasi tahu yang express pasti ditugaskan di sana. Kode Anda dapat menggunakan propertinya TrackingCode dengan aman. Anda tidak memerlukan pemeran terpisah. Jika Anda hanya memerlukan pengujian jenis dan tidak perlu mendeklarasikan variabel, gunakan pola jenis, seperti delivery is ExpressDelivery.

Gunakan is null atau is not null untuk pemeriksaan null. Pola-pola ini tidak memanggil operator != atau == yang ditentukan pengguna.

static void PrintPackageStatus(Delivery? delivery)
{
    if (delivery is null)
    {
        Console.WriteLine("No package is available.");
    }
    else
    {
        Console.WriteLine("A package is ready to track.");
    }
}

Untuk panduan keamanan null lainnya, lihat jenis referensi nullable.

Memilih antara pernyataan dan ekspresi

Pola dapat digunakan dengan kedua bentuk switch:

  • switch Gunakan pernyataan saat setiap kecocokan harus menjalankan satu atau beberapa pernyataan.
  • switch Gunakan ekspresi saat setiap kecocokan harus menghasilkan nilai.

Pernyataan switch berikut menampilkan pembaruan status pengiriman. Cabang pengiriman ekspres menghasilkan dua pesan, sehingga sebuah pernyataan dapat digunakan secara alami:

static void PrintDeliveryUpdate(Delivery? delivery)
{
    switch (delivery)
    {
        case null:
            Console.WriteLine("No delivery was scheduled.");
            break;
        case ExpressDelivery express:
            Console.WriteLine($"Express delivery {express.TrackingCode} is ready.");
            Console.WriteLine("Notify the priority desk.");
            break;
        case StandardDelivery standard:
            Console.WriteLine($"Standard delivery arrives in {standard.Days} days.");
            break;
        default:
            Console.WriteLine("Another delivery type is scheduled.");
            break;
    }
}

Masing-masing case menerapkan pola ke delivery ekspresi. Bagian yang cocok dapat menjalankan berapa pun jumlah pernyataan sebelum break keluar dari switch. default bagian menangani segala hal yang tidak cocok dengan kasus-kasus sebelumnya.

Ekspresi pengalihan berikut menggantikan if / else if rantai yang menetapkan satu hasil:

static string GetStatusMessage(StandardDelivery delivery) =>
    delivery.Days switch
    {
        0 => "Delivered today",
        1 => "Arriving tomorrow",
        <= 3 => "Arriving soon",
        _ => "In transit"
    };

Ekspresi switch ringkas karena setiap lengan memiliki tujuan yang sama: menghasilkan nilai yang dikembalikan. Gunakan pernyataan pengalihan saat cabang melakukan tindakan, dan gunakan ekspresi pengalihan saat cabang menghitung satu hasil.

Kategori pola

C# mencakup pola untuk jenis pengujian data umum:

Kategori pola Apa yang diuji
Deklarasi, konstanta, dan var pola Jenis run-time, nilai konstanta tertentu, atau nilai apa pun yang ingin Anda ambil
Pola tipe Jenis run-time tanpa mendeklarasikan variabel
Pola properti dan posisi Properti, bidang, atau nilai yang didekonstruksi
Pola relasional dan logis Perbandingan dan kombinasi seperti and, , ordan not
Pola daftar Nilai dan bentuk daftar atau larik
Buang pola dan buang Nilai yang tersisa, atau nilai yang sengaja diabaikan kode Anda

Artikel Dasar-Dasar yang ditautkan dalam tabel memberikan cakupan terfokus dari kategori yang saat ini didokumentasikan di bagian ini. Untuk sintaks dan contoh lengkap untuk semua kategori pola, lihat referensi pola.

Baca juga