はじめに
条件分岐の文法と言えばif文とswitch文が代表的だと思います。
特に網羅的な条件の場合はif文よりコードが見やすくなるため、switch文を使用する場合が多いのではないでしょうか。
普段何気なく使っているswitch文ですがC#8.0からswitch式が登場して、より使いやすくなりました。
特にC#や.NETは古い環境に縛られて開発しているプロジェクトが多いため(偏見?)新しい書き方に気が付いていない人も多いかもしれないです。
この記事ではまだswitch式を知らない人に向けて、古い書き方と比較しながら紹介をしたいと思います!
古い書き方
C#8.0未満の環境となるので、.NET Core 2.2や.NET Standard 2.0まではこの書き方になります。
一番ベーシックな書き方だと以下のようになります。
enum Direction {Up, Down, Right, Left }
enum Orientation {North, South, East, West}
static Orientation ToOrientation(Direction direction)
{
Orientation orientation;
switch(direction){
case Direction.Up:
orientation = Orientation.North;
break;
case Direction.Right:
orientation = Orientation.East;
break;
case Direction.Down:
orientation = Orientation.South;
break;
case Direction.Left:
orientation = Orientation.West;
break;
default:
throw new ArgumentOutOfRangeException();
}
return orientation;
}
一番最初にswitch文を書いたときは、このように書いたのではないでしょうか。
case
で始まり、分岐最後にbreak;
を書く所は記述量も増えてしまい可読性が悪いです。
実際にはこの環境下では以下のように書くことが多いと思います。
static Orientation ToOrientation(Direction direction)
{
switch(direction){
case Direction.Up: return Orientation.North;
case Direction.Right: return Orientation.East;
case Direction.Down: return Orientation.South;
case Direction.Left: return Orientation.West;
default: throw new ArgumentOutOfRangeException();
}
}
分岐中にreturn
することで後続に影響が無くなったためbreak;
が不要になりました。
この書き方であれば行数も少なくなり、条件と結果が横並びになっているため可読性も良さそうです。
しかし、分岐の先頭でcase
始まりなのは必須のため省略はできません。
switch式での書き方
switch式はC#8.0から登場したので、.NET Core 3.0や.NET Standard 2.1から利用可能になります。
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(),
};
switch式にすることでcase
を書く必要が無くなりました!
古い書き方と比べてreturn
も必要なく条件と結果だけをシンプルに表現することができました。
また、switch文と違い式なので変数の初期値としても利用ができます。
これは最初の古い書き方で行っていたような各条件分岐先で変数に代入することがなく、副作用の無い書き方ができるのがメリットです。
まとめ
C#8.0のリリースは2019年9月なので、switch式は執筆時の段階でもう約3年も前の機能になります。(現在最新リリースはC#10.0)
保守系のプロジェクトでは開発環境がずっと固定のためなかなか新しい機能は触れないことが多いと思います。
いざ新しいプロジェクトで最新の環境になった時に困らないためにも、どういった機能がリリースされているかはチェックしておきたいです!