[C#] 型の一致で処理を分岐をする方法(型スイッチ, is演算子, switch文)

[C#] 型の一致で処理を分岐をする方法(型スイッチ, is演算子, switch文)

C# において型で条件分岐

C#7 以降では、is演算子や switchステートメントの case 機能拡張され、型による処理の分岐が簡潔に書けるようになっています。具体的には以下のような機能です。

  • is演算子で型チェックをして、一致すれば変換結果を変数で受け取る
  • caseキーワードで型を指定して判定、一致したら変換結果を変数で受け取る

型による条件分岐の機能を 型スイッチ と呼びます。

is演算子型チェックと同時に変換結果を受け取る

is演算子はある変数が指定した型に一致するかどうかを判定します。

C# 6 以前だとis演算子による判定とは別に型変換のコードを書く必要があり、コード量的にも処理コスト的にもよくありませんでした。C# 7で追加された機能では、is演算子を使った1文のコードで、判定と変換結果の変数作成が同時に行えるようになりました。

変換は型チェックによって一致した場合のみ(is演算子がtrueを返す場合のみ)行われるため、変換処理の実行は失敗することはありません。

// 適当なobject型の変数
object obj = "ABCDEFG";

// objの型がstring型に一致する場合
// 変数strにobjをstring型に変換した値を入れる
if (obj is string str)
{
    // string型変数strが使える
    Console.WriteLine("文字列:" + str);
}

// 上のコードと同義
//if (obj is string)
//{
//    var str = (string)obj;
//    Console.WriteLine("文字列:" + str);
//}

caseステートメントで型分岐

C# 7以降では、switch文で型による条件分岐を行えます。is演算子の時と同様に型の判定と同時に変換結果を変数に入れて受け取ることができます。

変換は型チェックにいよって一致した場合のみ行われるため、変換処のが実行は失敗することはありません。

object obj = "123";

switch (obj)
{
    case string str:
        // objがstring型に一致する場合
        Console.WriteLine("文字列:" + str);
        break;
    case int n:
        // objがint型に一致する場合
        Console.WriteLine("整数値:" + n);
        break;
}

上記例では switch 文で string型とint型どちらかの判定を行っています。文字列の場合は1つ目のcaseに分岐し、int型の場合2つ目の分岐に処理が移ります。その際、変換した値をそれぞれの変数(str, n)で受け取っています。

whenキーワードで条件を追加する

型の一致判定だけでなく、さらに変換後の値を使って条件を分岐したい場合は、whenキーワードを使います。case内で型を指定下後ろに when で得られた変数に対しての条件を記述できます。

なの、判定は通常のswitch文と同じくcaseの上から順に逐次行われます。したがってcase順序が処理に影響します。

switch (obj)
{
    // int型に一致する場合かつ値が0である
    case int n when n == 0:
        Console.WriteLine("0です。");
        break;
    // int型に一致する場合かつ値が3以下でである
    case int n when n < 3:
        Console.WriteLine("3以下です。");
        break;
    // string型に一致する場合かつ3文字以下である
    case string s when s.Length >= 3:
        Console.WriteLine("3文字以上の文字列です。");
        break;
    default:
        Console.WriteLine("その他です。");
        break;
}

以上。

C#カテゴリの最新記事