C#入門⑰ スコープ ── 変数が使える「範囲」
前回は「引数と戻り値」をやりました。
今回は、変数が「どこまで使えるか」という話。スコープです。メソッドを理解した今だからこそ、すっきり分かります。
スコープとは、変数が使える「範囲」のことです。
同じ名前なのに、使えない?
こんなコードを見てください。エラーになります。
void ShowMessage()
{
string message = "こんにちは";
}
Console.WriteLine(message); // message なんて無い!エラー
message という変数は、たしかに作りました。なのに、メソッドの外で使おうとするとエラーになります。なぜでしょう。
理由は、変数には「使える範囲」があるからです。message は ShowMessage メソッドの中({ } の中)で作られたので、その中でしか使えません。外からは見えないのです。
変数は、生まれた { } の中だけで生きる
基本のルールは、これだけです。
変数は、それが作られた波カッコ { } の中でだけ使える。
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とは別物)
}
MethodA と MethodB、どちらも 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); // 外でも使える
「外で使いたい変数は、外で作る」。これを覚えておくと、スコープのエラーで困らなくなります。
まとめ
スコープは、変数が使える範囲のこと。
- 変数は、生まれた
{ }の中でだけ使える { }を抜けると、その変数は消える- 範囲が分かれているから、同じ名前が安心して使える
- 外で使いたいなら、外で先に作っておく
これで、処理をまとめる(メソッド・引数・戻り値・スコープ)がひととおり揃いました。
次回からは、いよいよプログラミング第三の山場、オブジェクト指向 に入っていきます。

