Bagikan melalui


ekspresi switch - ekspresi pencocokan pola menggunakan switch kata kunci

Anda menggunakan switch ekspresi untuk mengevaluasi ekspresi tunggal dari daftar ekspresi kandidat berdasarkan kecocokan pola dengan ekspresi input. Untuk informasi tentang switch pernyataan yang mendukung switch-seperti semantik dalam konteks pernyataan, lihat switch bagian pernyataan dari artikel Pernyataan pemilihan .

Contoh berikut menunjukkan switch ekspresi, yang mengonversi nilai dari arah visual yang enum mewakili dalam peta online ke arah kardinal yang sesuai:

public static class SwitchExample
{
    public enum Direction
    {
        Up,
        Down,
        Right,
        Left
    }

    public enum Orientation
    {
        North,
        South,
        East,
        West
    }

    public static Orientation ToOrientation(Direction direction) => direction switch
    {
        Direction.Up    => Orientation.North,
        Direction.Right => Orientation.East,
        Direction.Down  => Orientation.South,
        Direction.Left  => Orientation.West,
        _ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
    };

    public static void Main()
    {
        var direction = Direction.Right;
        Console.WriteLine($"Map view direction is {direction}");
        Console.WriteLine($"Cardinal orientation is {ToOrientation(direction)}");
        // Output:
        // Map view direction is Right
        // Cardinal orientation is East
    }
}

Contoh sebelumnya menunjukkan elemen switch dasar ekspresi:

  • Ekspresi diikuti dengan switch kata kunci. Dalam contoh sebelumnya, ini adalah direction parameter metode.
  • Lenganswitch ekspresi, dipisahkan oleh koma. Setiap switch lengan ekspresi berisi pola, pelindung huruf besar/kecil opsional, => token, dan ekspresi.

Pada contoh sebelumnya, switch ekspresi menggunakan pola berikut:

  • Pola konstanta: untuk menangani nilai enumerasi yang Direction ditentukan.
  • Pola buang: untuk menangani nilai bilangan bulat apa pun yang tidak memiliki anggota Direction enumerasi yang sesuai (misalnya, (Direction)10). Itu membuat switch ekspresi lengkap.

Penting

Untuk informasi tentang pola yang didukung oleh switch ekspresi dan contoh lainnya, lihat Pola.

Hasil ekspresi switch adalah nilai ekspresi lengan ekspresi pertama switch yang polanya cocok dengan ekspresi input dan pelindung kasusnya, jika ada, mengevaluasi ke true. Lengan switch ekspresi dievaluasi dalam urutan teks.

Pengkompilasi menghasilkan kesalahan ketika lengan ekspresi yang lebih rendah switch tidak dapat dipilih karena lengan ekspresi yang lebih tinggi switch cocok dengan semua nilainya.

Penjaga kasus

Pola mungkin tidak cukup ekspresif untuk menentukan kondisi untuk evaluasi ekspresi lengan. Dalam kasus seperti itu, Anda dapat menggunakan penjaga kasus. Penjaga kasus adalah kondisi lain yang harus dipenuhi bersama dengan pola yang cocok. Penjaga kasus harus berupa ekspresi Boolean. Anda menentukan penjaga kasus setelah when kata kunci yang mengikuti pola, seperti yang ditunjukkan contoh berikut:

public readonly struct Point
{
    public Point(int x, int y) => (X, Y) = (x, y);
    
    public int X { get; }
    public int Y { get; }
}

static Point Transform(Point point) => point switch
{
    { X: 0, Y: 0 }                    => new Point(0, 0),
    { X: var x, Y: var y } when x < y => new Point(x + y, y),
    { X: var x, Y: var y } when x > y => new Point(x - y, y),
    { X: var x, Y: var y }            => new Point(2 * x, 2 * y),
};

Contoh sebelumnya menggunakan pola properti dengan pola var berlapis.

Ekspresi sakelar yang tidak lengkap

Jika tidak ada pola ekspresi yang switch cocok dengan nilai input, runtime akan menampilkan pengecualian. Dalam .NET Core 3.0 dan versi yang lebih baru, pengecualiannya adalah System.Runtime.CompilerServices.SwitchExpressionException. Dalam .NET Framework, pengecualiannya adalah InvalidOperationException. Dalam kebanyakan kasus, pengkompilasi menghasilkan peringatan jika switch ekspresi tidak menangani semua kemungkinan nilai input. Pola daftar tidak menghasilkan peringatan ketika semua input yang mungkin tidak ditangani.

Tip

Untuk menjamin bahwa switch ekspresi menangani semua nilai input yang mungkin, berikan switch lengan ekspresi dengan pola buang.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian switch ekspresispesifikasi bahasa C#.

Lihat juga