[C#]switch文のcase句の中だけで有効な変数を宣言する[C,C++,javaも同様]

プログラム中に例えば、以下の様なswitch文があったとします。

void func( int inData ) {
 
    switch ( inData ) {
        case 1:
            ...;
            break;
        case 2:
            ...;
            break;
    }
}




このcase句の中で、ワークの一時変数を使いたい場合、以下のようにcase内で宣言する事が可能です。

int func( int inData ) {
 
    switch ( inData ) {
        case 1:
            int retVal = 10 + inData;
            return retVal;
        case 2:
            ...;
            break;
    }
}




ですが、下記のコードはエラーになってしまいます。

int func( int inData ) {
 
    switch ( inData ) {
        case 1:
            int retVal = 10 + inData;
            return retVal;
        case 2:
            int retVal = 10 * inData;   // NG:これはエラーになる
            return retVal;
    }
}


これは変数retValがメソッドfunc()全体で有効となり、同一変数名の重複定義となってしまうからです。



このような場合、以下のように各case句にブロック”{…}”を作ります。

int func( int inData ) {
 
    switch ( inData ) {
        case 1: {
            int retVal = 10 + inData;
            return retVal;
        }
        case 2: {
            int retVal = 10 * inData;   // OK
            return retVal;
        }
    }
}


上記のコードだと、ワーク変数のスコープがメソッド全体ではなくブロック内ローカルとなる為、名前が重複してもエラーとなりません。

一方で、switch分の後でこの変数を参照する事は出来ないので、注意が必要です。
…ですが、この記事の目的は”case句の中だけで有効な変数を宣言したい”なので、この制限は問題ではなく、逆にメリットになるはずです。


ちなみに、この手のテクニックは、C#固有なものではなく、C,C++,java言語等でも同様に使用可能です。



また、上記以外にswitchの外で変数定義を行う方法もあります。
(一般には、こっちのほうがスタンダードな書き方です)

int func( int inData ) {
    int retVal;
 
    switch ( inData ) {
        case 1:
            retVal = 10 + inData;
            break;
        case 2:
            retVal = 10 * inData;   // OK
            break;
    }
    return retVal;
}


これだと、switch文の後で変数値を参照する事が可能です。
一方でデメリットは変数の生存期間が必要以上に長くなるというデメリットが有ります。

関連記事

コメントを残す

メールアドレスが公開されることはありません。