C Sharpの基礎 - 条件分岐

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要



型スイッチ

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;
 }