switch文には、プログラミング言語の中で由緒ある歴史があります。switch文が導入されたのはCで、その速さが重宝されました。しかし、その速さと引き換えに、機能は大きく制限されていました。C#では、switch文の役割は整数にとどまらず広がっています。switch文は、任意の型、値、参照を扱うことができます。
関数型言語から来た場合、switch文(および別の場所で説明するswitch式)を扱うことは、C#で判別共用体とパターンマッチングを使うことに最も近い体験になります。ただし、型の安全性を強制する力は、判別共用体には遠く及びません。
単純なswitch文はCの先祖に似ており、switch、case、break、defaultを組み合わせて使います。
int direction = GetDirection();
switch (direction)
{
case 1:
GoLeft();
break;
case 2:
GoRight();
break;
default:
MarkTime();
break;
}
上のパターンは、あらゆる単純な型(プリミティブと文字列)で使えます。
参照型が加わると、追加の構文が必要になります。まず型をダウンキャストし、次にガード(when)を追加します。ただし、ガードは単純な値のcaseでも使えます。次に例を示します。
Animal animal = GetAnimal();
switch(animal)
{
case Dog canine:
case Coyote canine:
canine.Bark();
break;
case Cat cat when cat.HasOnly8Lives():
cat.IsCareful();
cat.Meow();
break;
case Cat cat:
cat.Meow();
break;
}
default節は省略できますが、通常は書いておくのが望ましいです。case節には、break文が必須です。caseラベルの引数の型はすべて、switchの引数の型から派生している必要があります。switchの引数がObject型であれば、当然ながら最も広い範囲を扱えます。caseの引数のメンバーだけでなく、スコープ内にあるものなら何でも書けます。case引数を持つ複数のcaseから、同じコードブロックを参照できます。switch文のドキュメントでは、switch文の入門が説明されています。