スコープとは
その実態を、余計な修飾をつけずに参照できる範囲。
変数、メソッド、プロパティ、型など、名前を持つものはスコープを持っている。
ローカル変数のスコープ
ローカル変数の場合、仮に修飾を付けてもスコープ外から参照することはできない。
変数が宣言されたところから、その変数が所属するブロックの最後までが変数のスコープ。
ブロックとは{}で囲まれた範囲のこと。
ネスト(入れ子)したブロックの場合、外側のブロックで宣言された変数は内側のスコープでも参照できる(スコープ内である)。
1 2 3 4 5 6 7 8 9 10 |
{ //Console.WriteLine(moji); //宣言する前には使用できない var moji = 'あ'; { Console.WriteLine(moji); //ネストの内側はスコープ内 } } //Console.WriteLine(moji); //宣言したブロックの外はスコープ外 |
宣言空間
スコープの外だからといって、一つの変数名を複数回宣言すると、混乱を生じやすくバグを生みやすい。
C♯ではスコープの外であっても、同じ宣言空間の範囲内であれば同じ名前を宣言できない仕様になっている。
宣言空間とは、同じ変数名を使用してはならない範囲のことである。
宣言する位置は関係なく、宣言されたブロックの先頭から最後までが宣言空間となる。ネストされたブロックの場合、親の宣言空間にある変数は宣言できない。
以下の例では、最後の行のnum2を宣言すると、5行目のnum2の宣言がコンパイルエラーとなる。
1 2 3 4 5 6 7 8 9 |
int num = 100; if(num == 100) { int num2 = 100 * 10; //コンパイルエラー Console.WriteLine(num2); //コンパイルエラー } int num2 = 200; |
上のコードでは最後行の宣言をブロックの先頭に移すとスコープ外となる。宣言空間の規則がなければ、コードの宣言位置で挙動が変わってしまう。このように宣言の位置でコードの意味が変わらないように宣言空間という概念が存在している。
参考書籍:Ian Griffithsプログラミング著 プログラミングC#