6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C#】switch式を使おう!

Last updated at Posted at 2022-07-20

はじめに

条件分岐の文法と言えば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)
保守系のプロジェクトでは開発環境がずっと固定のためなかなか新しい機能は触れないことが多いと思います。
いざ新しいプロジェクトで最新の環境になった時に困らないためにも、どういった機能がリリースされているかはチェックしておきたいです!


6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?