ラベル switch の投稿を表示しています。 すべての投稿を表示
ラベル switch の投稿を表示しています。 すべての投稿を表示

2018年2月18日日曜日

C#におけるswitch文の話

このブログは、自分が学習したことを忘れにくくするのが目的なので、C#を系統立てて説明したりするつもりはあまりありません。というか、そんな大それた事できません。

そういう事情から、前後のエントリーとの関連性や連続性はほとんどありません。

というわけで、今回のテーマはswitch文です。条件分岐の条件が多岐にわたる場合、if-elseで書くよりもswitchで書いた方がスッキリとした記述になりますね。

switch


まず、下記のリストをご覧下さい。

using System;

namespace sample3
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "hello";

            switch (s)
            {
                case "ok":
                    Console.WriteLine("OK!");
                    break;
                case "hello":
                    Console.WriteLine("Hi");
                    break;
                case "bye":
                    Console.WriteLine("good bye...");
                    break;
                default:
                    Console.WriteLine("???");
                    break;
            }
        }
    }
}

swich(s)から後ろがswitch文に当たります。このswitch文はCやC++にもあります。しかし、このリストのswitch文はCやC++では間違いです。コンパイルエラーになります。なぜなら、switch(式)で評価される式は、CやC++では整数型変数でなければならないからです。

しかし、C#ではこのswitchの文法が拡張されていて、整数型以外に文字列型を扱えるようになりました。

ですから、C# では正常にコンパイルできますし、書かれている印象どおりの動作をします。

上記リストだと、string型の変数sに"hello"を代入してからswitchで評価しているので、case "hello"のラベルにある処理が実行され、コンソールに"Hi"と表示されます。

ところで、Cでは、case文の後の処理の終わりにbreakを書かないことが許されていて、書かない場合は次のcase文の処理が実行されることになっていました。これをフォールスルーというそうです。C#ではこのフォールスルーが禁止され、breakを書き忘れるとコンパイルエラーになります。

フォールスルーさせたい場合は、goto case〜と、明示的にジャンプさせなければなりません。

フォールスルーは便利ではありますが、バグの原因にもなります。何度もやらかした経験があります。

なお、switch(式)の式が整数型でなければならないC/C++でも、enum(列挙型)を使って、プログラムを読みやすくする、という手法があるそうです。このサイトを読んで知りました。

    typedef enum date  {
        sunday,
        monday,
        tuesday,
        wednesday,
        thursday,
        friday,
        saturday
    } DATE;

    DATE day = monday;

    switch (day)
    {
        case sunday :
        case saturday :
            printf( "holiday\n" );
            break;
        case monday :
            printf( "swimming\n" );
            break;
        case tuesday :
        case thursday :
            printf( "play with friend\n" );
            break;
        case wednesday :
            printf( "piano lesson\n" );
            break;
        case friday :
            printf( "football class\n" );
        default :
            printf( "illegal data\n");
    }
}

たしかに直感的に分かるようになりますね。これをmainに組み込んで実行すると、mondayに対応するswimmingが表示されます。

それでは今回はこれで終わりです。

タイトルを若干変えました。switchと言っても、某ゲーム機の話と勘違いされちゃうと申し訳ないので・・・