C Sharp/条件分岐
< C Sharp
条件分岐[編集]
if文[編集]
C#にも if 文があり、概ねCファミリーのほかのプログラミング言語と同様な構文ですが、条件式は bool 型が必須です。
- if文の例
using System; public class IfStmtEx { public static void Main() { var n = 0.0 / 0.0; if (n > 0.0) { Console.WriteLine("n > 0.0"); } else if (n < 0.0) { Console.WriteLine("n < 0.0"); } else if (n == 0.0) { Console.WriteLine("n == 0.0"); } else { Console.WriteLine($"n = {n}"); } } }
- 実行結果
n = NaN
- 構文
if-stmt := if '(' 条件式 ')' 文1 [ else 文2 ]
- 条件式は、bool型である必要があります[1]。
- 文は、
Console.WriteLine("n > 0.0");
のような単文のほか、複文(ブロック; block)も含まれます(ここに示した例はすべて複文です)。- 複文とは、
{ }
で0個以上の文をまとめたものです。
- 複文とは、
else if
は、文法的には else節の文2が内包されるif文となったと解されます。その後のelseは直近のifと結合します。
switch文[編集]
C#にも switch 文があり、概ねCファミリーのほかのプログラミング言語と同様な構文ですが、条件式に整数式のほか文字列式を使うことができます。
整数式を条件としたswitch文[編集]
- switch文の例(整数式)
using System; public class SwitchStmtEx { public static void Main() { var random = new System.Random(); var i = random.Next(0, 16); switch (i) { case 2: case 3: case 5: case 7: Console.WriteLine($"{i}は一桁の素数です。"); break; default: Console.WriteLine($"{i}は一桁の素数ではありません。"); break; } } }
- 実行結果(1)
2は一桁の素数です。
- 実行結果(2)
4は一桁の素数ではありません。
- 実行結果(3)
11は一桁の素数ではありません。
- 実行結果(4)
7は一桁の素数です。
- 乱数を使っているので、結果はこの通りにはなりませんが分岐の様子はわかると思います。
文字列式を条件としたswitch文[編集]
- switch文の例(文字列式)
using System; public class SwitchStmtEx2 { public static void Main() { string[] ary = new string[] {"東京都", "神奈川県", "千葉県", "埼玉県", "茨城県", "群馬県", "栃木県", "山梨県"}; var random = new System.Random(); var x = ary[random.Next(0, ary.Length)]; switch (x) { case "栃木県": case "群馬県": case "埼玉県": case "山梨県": Console.WriteLine($"{x}は、海に面していません。"); break; default: Console.WriteLine($"{x}は、海に面しています。"); break; } } }
- 実行結果(1)
神奈川県は、海に面しています。
- 実行結果(2)
東京都は、海に面しています。
- 実行結果(3)
山梨県は、海に面していません。
- 実行結果(4)
茨城県は、海に面しています。
- 乱数を使っているので、結果はこの通りにはなりませんが分岐の様子はわかると思います。
- 構文
switch-stmt := switch '(' 条件式 ')' ’{’ case 式1 ':' 文1 case 式2 ':' 文2 … case 式n ':' 文n [ default ':' 文 ] '}'
switch式[編集]
C# 8 で、switch式が追加されました。
- switch式の例
using System; public class SwitchExprEx { public static void Main() { string[] ary = new string[]{"春", "梅雨", "夏", "秋", "冬"}; var random = new System.Random(); var x = ary[random.Next(0, ary.Length)]; var message = x switch { "春" => "Spring", "夏" => "Summer", "秋" => "Autumn", "冬" => "Winter", _ => throw new InvalidOperationException() }; Console.WriteLine($"{x}は、英語で {message} です。"); } }
- 実行結果(1)
冬は、英語で Winter です。
- 実行結果(2)
秋は、英語で Autumn です。
- 実行結果(3)
春は、英語で Spring です。
- 実行結果(4)
Unhandled exception. System.InvalidOperationException: Operation is not valid due to the current state of the object. at SwitchExprEx.Main() Command terminated by signal 6
- 乱数を使っているので、結果はこの通りにはなりませんが分岐の様子はわかると思います。
- switch式は、フォールスルーしません。
- 構文
switch-expr := 式 switch ’{’ 式1 '=>' 値1, 式2 '=>' 値2, … 式n '=>' 値n [ _ '=>' 値 ] '}'
switch による網羅性の担保[編集]
switch 式やswitch文と、enumを組合わせると、enumの定義するメンバーを網羅いていることの検証「網羅性の担保」が可能になります。
脚註[編集]
- ^ int 型などを条件式に書くとエラーになります。C#では、0を偽とはみなしません。
i != 0
の様に明示的に比較演算子を使いましょう