ZerOx4Cの日記だったもの

インポートだけしました

switchはややこしい

今日色々サイトを見て回ってて思ったんですけど、switch構文って嫌いな人も居るんですね。さすがにifが嫌い!しね!とか思ってたらプログラム書けませんけど、switchはifで代用余裕なので嫌っても問題は生じませんね。
僕自身はswitch便利なので使ってますけど、さっき書いてて「ん?」と思ったのでメモ。


フィールドのスコープは基本的に「{」と「}」の間に限定されるってのはすごく基本的な知識ですよね。ifもwhileも{}で囲まれているのでその外側には内側のフィールドがまったく影響しないわけですが、switchはちょっと違いますね。
ifは条件に合致したときの処理が{}で囲まれていますけど、switchはcaseで条件に合致しても{}を使わずに、breakで抜けています。そもそもswitchは条件式じゃないですが。
あれ?caseはgoto文とお友達だったか?・・・まぁそういうややこしい話は置いといて、ちょっとテストコードを書いてみました。

bool flag = false;

switch (flag) {
    case true:
        string str = "(`ェ´)ピャー"; // 1
        Console.WriteLine(str);
        break;
    case false:
        str = "| ^o^ | < しょうゆ おいしいです"; // 2
        Console.WriteLine(str);
        break;
}

実行するとブームくんがしょうゆを飲みます。(//2)
ちなみに「flag == true」なら佐藤裕也です。(`ェ´)ピャー(//1)
実は別のコードの//2に相当する部分で「string str = "ごにょごにょ";」的なコードを書いたら、「スコープ範囲内にstrが既に存在しているうんたらかんたら」ってエラーが出たんですよ。
確かに{}で囲ってないので、スコープ範囲内にstrが既に存在していますけど、上のコードだと//1の部分を通りません。・・・いつstrは初期化されたの?
コンパイラがなんとかしちゃったんでしょうか。調べる術は知りませんが、気力が無いので寝るますけど、ちょっと気になります。


まぁ最初の話題ですけど、確かに書き手によってこうトリッキーな動きをするswitchを嫌う理由も分かる気がしますね。