Pola relasional, logis, dan yang diapit tanda kurung

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 relasional dan pola logis dalam referensi bahasa.

Pola relasional dan logis menjelaskan rentang, alternatif, dan pengecualian. Metode berikut menggabungkannya untuk mengklasifikasikan suhu:

static string ClassifyTemperature(int temperature) =>
    temperature switch
    {
        < 0 => "Below freezing",
        >= 18 and <= 24 => "Comfortable",
        (>= 0 and < 10) or > 30 => "Far outside the comfortable range",
        _ => "Cool or warm"
    };

Ekspresi temperature adalah input pola. C# mengevaluasinya sekali, dan setiap cabang switch menguji nilai yang dihasilkan. Senjata menunjukkan tes ini:

  • < 0 menguji satu batasan.
  • >= 18 and <= 24 menguji rentang.
  • (>= 0 and < 10) or > 30 menguji dua rentang alternatif.

Artikel ini menunjukkan pola dan kondisi imperatif sehingga Anda dapat mempelajari setiap formulir dan membandingkan bagaimana mereka mengekspresikan keputusan yang sama. Satu kondisi dapat terlihat serupa dalam salah satu bentuk. Pola dapat membuat serangkaian cabang yang terkait lebih mudah dibaca dengan menempatkan pilihan-pilihannya di samping hasilnya. Pilih formulir yang membuat kode paling mudah dipahami.

Membandingkan nilai dengan pola relasional

Pola relasional membandingkan input polanya dengan konstanta waktu kompilasi dengan menggunakan <, , ><=, atau >=. Konstanta waktu kompilasi adalah nilai yang dapat dievaluasi pengkompilasi saat mengkompilasi program. Literal numerik dan karakter, serta variabel const dengan tipe numerik atau karakter yang kompatibel, merupakan contoh yang representatif. Variabel, properti, panggilan metode, dan static readonly bidang biasa bukan konstanta waktu kompilasi. Dalam contoh pembuka, >= 18 dan <= 24 keduanya menguji nilai temperature hasil evaluasi yang sama.

Simbol relasional yang sama dapat muncul dalam ekspresi biasa atau dalam pola. Contoh berikut menggunakan kedua bentuk tersebut dengan suhu:

static void ShowExpressionAndPattern(int temperature, int threshold)
{
    bool belowThreshold = temperature < threshold;
    bool belowFreezing = temperature is < 0;

    string description = temperature switch
    {
        < 0 => "Freezing",
        0 => "Freezing point",
        > 0 => "Above freezing"
    };

    Console.WriteLine(
        $"Below threshold: {belowThreshold}; " +
        $"below freezing: {belowFreezing}; {description}");
}

temperature < threshold adalah ekspresi relasional. Ini mengevaluasi kedua operan dan menghasilkan bool. Salah satu operan dapat menjadi ekspresi yang tidak konstant.

Dalam temperature is < 0, temperature adalah ekspresi masukan pola. C# mengevaluasinya, dan pola < 0 relasional menguji nilai yang dihasilkan. Pada lengan switch < 0 => "Freezing", ekspresi sebelum switch memberikan input, sehingga pola hanya berisi < 0.

Ekspresi dapat dibandingkan temperature dengan variabel threshold. Operand pola relasional harus berupa konstanta waktu kompilasi, jadi gunakan ekspresi relasional saat nilai perbandingan adalah variabel. Ketika nilai perbandingan konstanta, salah satu formulir dapat berfungsi.

Ketika operand kanan konstan, pilih terutama untuk keterbacaan. Ekspresi relasional sering cocok dengan satu perbandingan langsung. Pola relasional dapat dipadukan dengan pola lain dan cocok digunakan ketika beberapa rentang dipetakan ke hasil switch.

Menggabungkan kondisi dengan pola logis

Pola logika menggabungkan atau menegasikan pola dengan operator pola and, or, dan not:

  • Pola and cocok ketika kedua pola berlapis cocok.
  • Pola or cocok ketika salah satu pola berlapis cocok.
  • Pola not berhasil ketika pola bertingkat di dalamnya gagal.

Contoh pembukaan menggunakan and untuk menjelaskan rentang dan or untuk menjelaskan alternatif. Pola not dapat mengecualikan nilai, seperti dalam status is not Status.Complete. Metode berikut menunjukkan kedua formulir sehingga Anda dapat mempelajari sintaksnya dan membandingkan bagaimana mereka mengekspresikan pengujian yang sama:

static bool IsWeekendPattern(DayOfWeek day) =>
    day is DayOfWeek.Saturday or DayOfWeek.Sunday;

static bool IsWeekendImperative(DayOfWeek day) =>
    day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;

Formulir pola menggunakan dua pola konstanta yang digabungkan oleh or. Formulir imperatif menggunakan dua ekspresi kesetaraan yang bergabung dengan operator ||CONDITIONAL-OR . Kedua bentuk ini ringkas dan jelas untuk satu kondisi ini. Pilih formulir yang paling sesuai dengan kode di sekitarnya. Pola sering mengklarifikasi beberapa pilihan terkait dalam switch, seperti dalam contoh pembukaan.

Operator pola membentuk pola, bukan ekspresi Boolean: and mengacu pada konjungsi pola, or pada alternatif pola, dan not pada negasi pola. Ekspresi Boolean menggunakan &&, ||, dan !. Pilih or kapan beberapa alternatif pola memiliki hasil yang sama. Pilih not saat mengekspresikan pola yang dikecualikan lebih jelas daripada mencantumkan setiap nilai yang diterima.

Pola grup dengan tanda kurung

Pola yang dikurung menggunakan tanda kurung untuk memperlihatkan atau mengubah cara pola berlapis dikelompokkan. Pengikatan menentukan operand pola mana yang dikelompokkan bersama oleh suatu operator, mirip dengan pengelompokan implisit ketika Anda tidak menulis tanda kurung. C# menentukan urutan pengikatan berikut:

  1. not
  2. and
  3. or

Pengujian berikut menerima prioritas 1 hingga 3 atau prioritas khusus 9:

static bool IsAcceptedPriority(int priority) =>
    priority is (>= 1 and <= 3) or 9;

Kompilator mengelompokkan and sebelum or. Tanda kurung membuat pengelompokan yang dimaksudkan eksplisit dan dua alternatif mudah dilihat: rentang dari 1 hingga 3, atau 9. Untuk keterbacaan, gunakan tanda kurung jika suatu pola memadukan and dan or, atau saat not diterapkan pada pola majemuk. Tanda kurung juga dapat mengubah pengelompokan default, seperti dalam not (>= 1 and <= 3).

Urutan pemeriksaan saat runtime untuk pola bertingkat tidak ditentukan, dan operator pola mengikuti aturan pencocokan pola, bukan aturan Boolean short-circuit. Tulis pola berlapis sehingga hasilnya tidak bergantung pada urutan pemeriksaan.

when Menggunakan penjaga untuk kondisi terpisah

Pola logis berfungsi paling baik ketika pola berlapis menggambarkan nilai input itu sendiri. Guard when adalah kondisi Boolean tambahan pada label case atau cabang switch. Gunakan penjaga ketika keputusan juga tergantung pada informasi yang terpisah dari input pola.

Peringatan berikut bergantung pada suhu dan nilai yang terpisah isOutdoors:

static string GetHeatWarning(int temperature, bool isOutdoors) =>
    temperature switch
    {
        > 35 when isOutdoors => "High heat outdoors",
        > 35 => "High heat",
        _ => "No heat warning"
    };

Pola relasional > 35 menjelaskan masukan temperature. Penjaga when isOutdoors memeriksa nilai terpisah. Klausa guard juga lebih dianjurkan jika kondisinya memerlukan pemanggilan metode atau ekspresi Boolean yang tidak dapat dinyatakan dengan jelas oleh sintaks pola.

Gunakan pola relasional dan logis saat membuat bentuk atau nilai input yang diizinkan lebih mudah dilihat, terutama di beberapa lengan sakelar. Gunakan ekspresi Boolean biasa ketika menyatakan kondisi langsung lebih sederhana. Gunakan guard when saat pilihan pada switch bergantung pada nilai lain atau pada kondisi yang lebih tepat dinyatakan sebagai ekspresi Boolean.

Baca juga