C Sharpの基礎 - 条件分岐

提供:MochiuWiki : SUSE, EC, PCB
2024年1月23日 (火) 00:43時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == 型スイッチ == C# 7以降では、<code>is</code>演算子や<code>switch</code>文の<code>case</code>機能拡張されて、型による処理の分岐が記述できる。<br> * <code>is</code>演算子でデータ型を確認して、一致した場合は、結果を変数で返す。 * <code>case</code>キーワードで型を指定して判定する。<br>型が一致した場合は、結果を変数で返す。 <br> ==== is演…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要



型スイッチ

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