C Sharpの基礎 - 条件分岐
ナビゲーションに移動
検索に移動
概要
型スイッチ
C# 7以降では、is
演算子やswitch
文のcase
機能拡張されて、型による処理の分岐が記述できる。
is
演算子でデータ型を確認して、一致した場合は、結果を変数で返す。case
キーワードで型を指定して判定する。
型が一致した場合は、結果を変数で返す。
is演算子型チェック
// C# 6以前
// バイト順マーク (BOM) からエンコーディングを取得
if (bytes.Length >= 2 && bytes[0] == 0xFE && bytes[1] == 0xFF) => Encoding.BigEndianUnicode; // UTF-16 Big Endian
else if (bytes.Length >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE) => Encoding.Unicode; // UTF-16 Little Endian
else if (bytes.Length >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) => Encoding.UTF8; // UTF-8
// C# 7以降
// バイト順マーク (BOM) からエンコーディングを取得
if (bytes is [0xFE, 0xFF, ..]) => Encoding.BigEndianUnicode; // UTF-16 Big Endian
else if (bytes is [0xFF, 0xFE, ..]) => Encoding.Unicode; // UTF-16 Little Endian
else if (bytes is [0xEF, 0xBB, 0xBF, ..]) => Encoding.UTF8; // UTF-8
caseステートメントで型分岐
変換は型チェックで一致した場合のみ行われるため、実行処理は失敗しない。
以下の例では、switch
文で文字列型および整数型の判定を実施している。
文字列の場合は上のcaseに分岐、整数型の場合は下の分岐する。
分岐時において、変換した値を変数strおよび変数nで受けている。
object obj = "123";
switch (obj) {
case string str: // objがstring型に一致する場合
Console.WriteLine("文字列:" + str);
break;
case int n: // objがint型に一致する場合
Console.WriteLine("整数値:" + n);
break;
}
型の一致判定に加えて、変換後の値を使用して条件分岐する場合、when
キーワードで条件を追加する。
case
キーワード内でデータ型を指定下後ろに when で得られた変数に対しての条件を記述できます。
判定は一般的なswitch
文と同様、case
キーワードの上から順に逐次行われる。
そのため、case
キーワードの順序が処理に影響する。
switch (obj) {
case int n when n == 0: // int型に一致する場合、かつ、値が0の場合
Console.WriteLine("n is int, and value is eqauls 0.");
break;
case int n when n < 3: // int型に一致する場合、かつ、値が3以下の場合
Console.WriteLine("n is int, and value is less than 3.");
break;
case string s when s.Length >= 3: // string型に一致する場合、かつ、3文字以下の場合
Console.WriteLine("n is str, and length is greater than 3.");
break;
default:
Console.WriteLine("etc...");
break;
}