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#. Mulailah dengan gambaran umum pencocokan pola jika pola baru bagi Anda. Untuk aturan bahasa lengkap, lihat pola properti dan pola posisi dalam referensi bahasa.
Pola properti dan pola posisional sama-sama menguji bagian dari sebuah nilai. Perbedaannya adalah bagaimana mereka mengidentifikasi bagian-bagian tersebut:
- Pola properti menamai properti atau bidang yang akan diuji.
- Pola posisi mengidentifikasi nilai berdasarkan urutannya.
Dekonstruksi mengekspos sekumpulan nilai komponen yang diurutkan. Tuple sudah memiliki urutan elemen; lihat mendekonstruksi tuple. Untuk jenis lain, Deconstruct metode menentukan nilai komponen mana yang diekspos dan urutannya.
Membandingkan nama dan posisi
Pola properti berikut menguji dua properti bernama pembacaan cuaca, dengan nilai suhu dalam derajat Celcius:
static bool IsHotAndHumid(WeatherReading reading) =>
reading is { TemperatureC: > 30, HumidityPercent: > 70 };
sealed record WeatherReading(int TemperatureC, int HumidityPercent);
Pola posisi berikut menguji nilai sinyal diikuti oleh nilai Boolean:
static string GetCrossingInstruction(
PedestrianSignal signal, bool crossingIsClear) =>
(signal, crossingIsClear) switch
{
(PedestrianSignal.Walk, true) => "Cross now",
(PedestrianSignal.Walk, false) => "Wait for the crossing to clear",
_ => "Wait for the walk signal"
};
enum PedestrianSignal
{
Stop,
Walk
}
Pola properti mengidentifikasi inputnya dengan nama TemperatureC dan HumidityPercent. Kode persimpangan membuat tuple dari nilai crossingIsClear dan signal yang terpisah. Pola tuple kemudian mengidentifikasi nilai-nilai tersebut berdasarkan urutan: signal pertama dan crossingIsClear kedua. Pola posisional sangat cocok karena tupel yang baru dibuat ini hanya memiliki dua nilai, dan urutannya memiliki arti yang jelas dalam keputusan persimpangan.
Pilih pola properti saat nama anggota membantu menjelaskan pengujian. Pola properti biasanya lebih jelas untuk kelas, struktur, dan rekaman. Pilih pola posisi saat urutan sudah memberi nilai arti yang jelas. Pola posisional paling berguna saat digunakan dengan tuple, yang menggabungkan beberapa nilai terkait menjadi satu nilai dalam urutan tetap.
Ikuti input berlapis dalam pola rekursif
Pola properti dan posisi adalah pola rekursif: Pola tersebut menerapkan pola lain ke setiap properti, bidang, atau posisi yang dipilih. Nilai yang dipilih menjadi input ke pola berlapis tersebut.
Dalam IsHotAndHumid, ekspresi reading merupakan masukan untuk pola properti. C# mengevaluasi ekspresi tersebut sebelum mencocokkan. Pola mendapatkan dua nilai dari objek yang dihasilkan:
- Pola
> 30relasional menguji nilaiTemperatureC. - Pola
> 70relasional menguji nilaiHumidityPercent.
Pengujian jenis luar bersifat opsional, dan klausul pola rekursif dapat kosong. Misalnya, pola properti kosong { } cocok dengan nilai apa pun yang hasil evaluasinya bukan null.
Pola properti dan pola posisional hanya cocok dengan nilai yang dievaluasi yang bukan null. Saat null merupakan bagian dari domain input, pilih pola rekursif yang memeriksa nilai non-null terlebih dahulu:
static string DescribeNullableInput(object? value)
{
if (value is not { } nonNullValue)
{
return "No value";
}
return nonNullValue switch
{
DateTime => "Date",
string => "Text",
_ => "Another type"
};
}
Ekspresi input adalah value. C# mengevaluasinya, dan pola properti { } menguji apakah nilai yang dihasilkan tidak null sebelum menetapkan nilai tersebut ke nonNullValue. Ekspresi sakelar berikut kemudian dapat menguji beberapa jenis runtime yang mungkin. Pola jenis string dan DateTime miliknya tidak memiliki penamaan karena metode tersebut hanya perlu mengidentifikasi setiap jenis, bukan untuk mengambil nilainya.
Saat klausul pola rekursif berisi pola berlapis, setiap properti, bidang, atau posisi yang dipilih menjadi input ke pola berlapisnya.
Anda dapat menambahkan uji tipe sebelum kurung kurawal saat ekspresi masukan dapat menghasilkan tipe yang berbeda. Anda juga dapat menggunakan jalur anggota untuk memeriksa properti bertingkat:
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
value adalah ekspresi input. C# pertama-tama mengevaluasinya dan menguji apakah nilai yang dihasilkan adalah DateTime. Nilai properti Date kemudian menjadi input untuk akses anggota DayOfWeek. Akhirnya, DayOfWeek nilai menjadi input ke pola logis yang menguji dua konstanta. Pencocokan berhasil ketika nilai terluar memiliki tipe yang ditentukan dan setiap objek yang diperlukan sepanjang jalur anggota tidak bernilai null.
Membandingkan pola dengan pernyataan percabangan
Metode sebelumnya DescribeDate mengekspresikan empat hasil sebagai pola:
static string DescribeDate(object? value) =>
value switch
{
DateTime { Date.DayOfWeek:
DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
DateTime => "Weekday date",
null => "No date",
_ => "Not a date"
};
Metode berikut menghasilkan hasil yang sama dengan serangkaian pernyataan percabangan imperatif:
static string DescribeDateWithBranches(object? value)
{
if (value is DateTime date)
{
if (date.DayOfWeek == DayOfWeek.Saturday ||
date.DayOfWeek == DayOfWeek.Sunday)
{
return "Weekend date";
}
return "Weekday date";
}
if (value is null)
{
return "No date";
}
return "Not a date";
}
Versi berbasis pola menyimpan kemungkinan hasil bersama-sama ketika beberapa cabang menguji jenis dan bentuk nilai. Versi imperatif membuat setiap langkah pengujian dan pengembalian menjadi eksplisit. Dalam kondisi tertentu, kedua bentuknya mungkin tampak mirip. Seiring bertambahnya jumlah cabang terkait, pola dapat membuat alternatif lebih mudah dibandingkan.