【C#】switchとパターン

switchステートメント

基本的なswitch文

switch文(switchステートメント)を使うと、指定した式(変数など)の値によって処理を分岐させることができる。

caseでパターンを指定するため、switch-case文とも呼ばれる。

最も基本的なswitch文は、caseの後に定数(定数パターン)を用いるものである。定数パターンには文字列や整数が使える。

以下の例では変数countryの値によって処理を振り分け、それぞれにふさわしい国名コードを出力する。

countryがいずれのcaseにも該当しなければdefaultが実行される。もしdefaultがなければ何もしない。

case ○○: やdefault:の末尾はセミコロンではなくコロンなので注意。

フォールスルーの禁止

C言語など他の言語では、1つのcase区画の終点に達すると次のcase区画に自動的に移るフォールスルーをサポートしているものも多い。

しかし、実際にはbreakの書き忘れであることが多いため、C♯ではフォールスルーはサポートされていない。また、C#コンパイラは各case区画の終点に到達してはいけないというルールがある。

上記のことから、C#ではcase区画の最後にbreak;を書かないとコンパイルエラーになる。

ただし実際はbreak;に限らず、switchの外に実行を移すものであれば何でも使える。(後述)

もしフォールスルーを実装したい場合は後述するgoto caseを使う。

caseに複数の処理を書く/同じ処理をするcaseをまとめて書く

case区画には複数のステートメント(文)を記述することもできる。

また、同じ処理をするラベルがある場合はcaseをまとめて書くことができる。

以下の例は変数statusの値によって表示内容を変えるswitchステートメント。statusは”締め切り直前”なので、「首の皮一枚」「もっとがんばれ」と表示される。

breakの位置にreturnやgoto caseを使う

switchステートメントのcase区画の最後で使えるのはbreak;だけではない。

returnは呼び出し元に値を返すことができる。

goto caseは、gotoの一種である。現在のプログラミングではgotoはほぼ使われないため、gotoが使われるのはgoto caseでだけかもしれない。

goto caseを使うと、switch内の別のラベルのcaseに飛ばすことができる。

以下の例ではstatusが”外出中”なので、goto caseによって”離席中”のcaseに飛ばされ、returnによって「今いません」が呼び出し元に返される。

switchで様々なパターンを使う

タプルパターン

破棄パターンを加えることで、defaultと同じ効果を得ることができる。つまり、すべてのパターンを網羅することができる。

型パターン

object型はほぼすべての型を格納できる。式の値をobject型にし、型パターンを用いると型に応じて処理を分けることができる。

破棄パターン

パターンにマッチしているか調べるだけで変数への出力は必要ないという場合はアンダースコアを使う。これを破棄パターンという。

位置指定パターン

位置指定パターン

以下の例ではint型のすべての値にマッチし、その値を変数xに抽出する。これを位置指定パターンという。

位置指定パターンは、パターンを含むパターンである再帰パターンの一例。

以下はvarを使った例。この場合すべての入力にマッチする。

以下の場合ではxはstring型、yはint型になる。

破棄を伴う型パターンと破棄パターン

位置指定パターンで破棄を伴う型パターンと破棄パターンを使う。

プロパティパターン

whenを使いパターンを限定する

when句を使うことでさらに精度の高いパターンマッチングを指定できる。

when句にはブール式(結果がTrueかFalseになる式)を使うことができる。

switch式

switch文ではなくswitch式を使うと、caseやbreakを書く必要がなくなり、コンパクトに記述することができる。

また式であるため、メソッドの引数にしたり変数に格納するなど、あらゆる場所に組み込むことができる。

ただし、switch式は値を生成するため、すべてのパターンを記述する必要がある。

またswitch式は1つのパターンにつき1つのステートメントしか書けない。

パターンと処理ステートメントの区切りは=>を使用する。

コメント

タイトルとURLをコピーしました