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 pernyataan switch yang mendukung switch-seperti semantik dalam konteks pernyataan, lihat bagian switch pernyataan dari artikel Pernyataan pilihan.

Contoh berikut menunjukkan ekspresi switch, yang mengonversi nilai enum yang mewakili arah visual di 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 dasar ekspresi switch:

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

Pada contoh sebelumnya, ekspresi switch menggunakan pola berikut:

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

Penting

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

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

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

Pelindung kasus

Pola mungkin tidak cukup ekspresif untuk menentukan kondisi evaluasi ekspresi lengan. Dalam kasus seperti itu, Anda dapat menggunakan case guard. Penjaga kasus adalah kondisi lain yang harus dipenuhi bersama dengan pola yang cocok. Peindung kasus harus berupa ungkapan bersyarat. Anda menentukan pelindung kasus setelah kata kunci when 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 bersarang.

Ekspresi sakelar yang tidak lengkap

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

Tip

Untuk menjamin bahwa ekspresi switch menghandel semua kemungkinan nilai masukan, berikan switch lengan ekspresi dengan pola buang.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian switch ekspresi dari catatan proposal fitur.

Lihat juga