Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
casedari pernyataanswitch. - 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:
-
nulladalah pola konstan. Menguji apakah ekspresideliverybernilainull. -
ExpressDelivery expressadalah pola deklarasi dengan dua bagian.ExpressDeliveryadalah bagian pengujian tipe. Ini menguji apakah nilai yang dievaluasi adalah objek non-null yang jenis run-time-nya kompatibel denganExpressDelivery.expressadalah penentuan variabel: ini mendeklarasikan variabel bernamaExpressDeliverydan menetapkan objekexpressyang cocok ke variabel tersebut. -
StandardDelivery { Days: <= 2 }dimulai dengan pengujian tipe.StandardDeliverymenguji apakah nilai yang dievaluasi adalah objek non-null dari jenis tersebut. Tanda kurung kurawal berisi pola properti.Daysmemberi nama properti untuk diperiksa, sehinggaDaysekspresi properti menjadi input ke pola rekursif. Bagiannya<= 2adalah pola relasional, yang menguji apakah nilai yang dievaluasi kurang dari atau sama dengan2. -
_(garis bawah) adalah pola buang. Ini cocok dengan setiap nilai yang dievaluasi, termasuknull. Karena lengan sebelumnya sudah menanganinull, 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:
-
switchGunakan pernyataan saat setiap kecocokan harus menjalankan satu atau beberapa pernyataan. -
switchGunakan 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.