前回は「引数と戻り値」をやりました。

今回は、変数が「どこまで使えるか」という話。スコープです。メソッドを理解した今だからこそ、すっきり分かります。

スコープとは、変数が使える「範囲」のことです。

同じ名前なのに、使えない?

こんなコードを見てください。エラーになります。

void ShowMessage()
{
    string message = "こんにちは";
}

Console.WriteLine(message);   // message なんて無い!エラー

message という変数は、たしかに作りました。なのに、メソッドの外で使おうとするとエラーになります。なぜでしょう。

理由は、変数には「使える範囲」があるからです。messageShowMessage メソッドの中({ } の中)で作られたので、その中でしか使えません。外からは見えないのです。

変数は、生まれた { } の中だけで生きる

基本のルールは、これだけです。

変数は、それが作られた波カッコ { } の中でだけ使える。

void ShowMessage()
{
    string message = "こんにちは";   // この { } の中で生まれた
    Console.WriteLine(message);      // 同じ { } の中なので、使える
}                                    // ここで message は消える

メソッドの { } の中で生まれた変数は、その { } を抜けると消えます。だから外からは使えないのです。

料理でたとえるなら、それぞれの調理台の上のようなもの。Aさんの調理台に出した材料は、Aさんの台でしか使えません。Bさんの台からは手が届かない。各自の台({ })の中だけで完結しているイメージです。

なぜ、範囲が分かれていると良いのか

「全部の変数が、どこからでも使える方が便利では?」と思うかもしれません。でも、範囲が分かれているのには、ちゃんと理由があります。

名前がぶつからないからです。

void MethodA()
{
    int count = 0;   // Aのcount
}

void MethodB()
{
    int count = 100; // Bのcount(Aとは別物)
}

MethodAMethodB、どちらも count という変数を使っています。でも、それぞれの { } の中だけのものなので、まったく別物として共存できます。お互いに影響しません。

もし全部の変数がどこからでも見えたら、同じ名前を使うたびにぶつかってしまう。範囲が分かれているおかげで、安心して同じ名前が使えるのです。

if文やfor文でも、同じ

このルールは、メソッドだけでなく、if文やfor文の { } でも同じです。

for (int i = 0; i < 5; i++)
{
    int temp = i * 2;     // for の { } の中で生まれた
    Console.WriteLine(temp);
}

Console.WriteLine(temp);  // for の外。temp はもう無い!エラー

for文の中で作った temp は、for文の { } を抜けると消えます。

第8回で出てきたカウンター i も同じです。i は for文のカッコの中で作られるので、for文の中でだけ使える変数なんです。

つまずきポイント

初心者がはまるのが、「中で作った変数を、外で使おうとする」ことです。

if (score >= 60)
{
    string result = "合格";
}
Console.WriteLine(result);   // if の外。result は無い!エラー

result は if文の中で生まれたので、外では使えません。

外でも使いたいなら、外で先に作っておくのがコツです。

string result = "";          // 外で作る
if (score >= 60)
{
    result = "合格";          // 中で値を入れる
}
Console.WriteLine(result);   // 外でも使える

「外で使いたい変数は、外で作る」。これを覚えておくと、スコープのエラーで困らなくなります。

まとめ

スコープは、変数が使える範囲のこと。

  • 変数は、生まれた { } の中でだけ使える
  • { } を抜けると、その変数は消える
  • 範囲が分かれているから、同じ名前が安心して使える
  • 外で使いたいなら、外で先に作っておく

これで、処理をまとめる(メソッド・引数・戻り値・スコープ)がひととおり揃いました。
次回からは、いよいよプログラミング第三の山場、オブジェクト指向 に入っていきます。