C#のスコープとは?ローカル変数とグローバル変数の違いと使い分けを徹底解説!
生徒
「C#で変数を使っているんですけど、ある場所では使えるのに、別のところではエラーが出るのはなぜですか?」
先生
「それは『スコープ(scope)』が関係しているかもしれません。スコープとは、変数が使える範囲のことを意味します。」
生徒
「なるほど…。それってローカル変数とかグローバル変数と関係があるんですか?」
先生
「はい、関係大アリです!では、C#のスコープについて一緒に見ていきましょう。」
1. スコープとは?C#の変数の使える範囲
プログラミング言語のC#(シーシャープ)では、「スコープ」という考え方がとても大切です。スコープとは、その変数が使える範囲のことです。たとえば、家の中でしか使えないリモコンと、どこでも使えるスマートフォンのような違いがあります。
スコープが正しく理解できていないと、「この変数はどこから来たの?」「使えないって言われる…」と混乱しがちです。C#では主に、ローカル変数とグローバル変数(※正確にはクラスレベルの変数)があります。
2. ローカル変数とは?
ローカル変数とは、特定のブロック(かたまり)の中だけで使える変数のことです。ブロックとは、波かっこ { }
で囲まれた範囲のことです。例えば、メソッド(関数)の中や、if文の中などがそうです。
では、実際にローカル変数の例を見てみましょう。
void SampleMethod()
{
int number = 10; // これはローカル変数
Console.WriteLine(number);
}
このnumber
という変数は、SampleMethod
の中でしか使えません。外のコードからこの変数にアクセスしようとするとエラーになります。
3. グローバル変数とは?(クラスレベルの変数)
実は、C#には「完全なグローバル変数」はありません。しかし、クラスの中で定義された変数を「グローバル変数」と呼ぶことがあります。
これは、そのクラスのすべてのメソッドから使える変数です。以下の例を見てみましょう。
class MyClass
{
int count = 0; // クラスレベルの変数(グローバル変数のようなもの)
void AddCount()
{
count = count + 1;
Console.WriteLine(count);
}
void ResetCount()
{
count = 0;
}
}
count
という変数は、AddCount
メソッドでもResetCount
メソッドでも使えていますね。これがクラス全体で共有される変数、つまり「グローバル変数のようなもの」です。
4. ローカル変数とグローバル変数の違い
ここで、ローカル変数とグローバル変数(クラスレベルの変数)の違いを整理してみましょう。
- ローカル変数:そのブロックの中だけで使える
- グローバル変数:クラス全体で使える
もしローカル変数と同じ名前のグローバル変数があった場合は、ローカル変数が優先されます。
5. スコープの重なりと注意点
スコープが重なることもあります。つまり、同じ名前の変数が複数のスコープに存在すると、プログラムが混乱することがあります。
int number = 5; // クラスレベルの変数
void Sample()
{
int number = 10; // ローカル変数(上の変数を「隠して」しまう)
Console.WriteLine(number); // これは10と表示される
}
このように、ローカル変数がグローバル変数と同じ名前だと、グローバル変数は使えなくなります。これをシャドーイング(Shadowing)と言います。
6. 実行結果の例で確認しよう
では、スコープによって変数の使える範囲がどう変わるのか、実行結果で確認してみましょう。
class ScopeExample
{
int globalValue = 100;
void ShowValues()
{
int localValue = 50;
Console.WriteLine("ローカル変数:" + localValue);
Console.WriteLine("グローバル変数:" + globalValue);
}
}
ローカル変数:50
グローバル変数:100
このように、メソッド内ではローカル変数とグローバル変数の両方を使い分けることができます。
7. なぜスコープを理解することが大切なのか?
プログラムを書くうえで、変数がどこで使えて、どこで使えないのかを理解していないと、予期せぬエラーやバグ(間違った動作)の原因になります。
スコープをしっかり把握しておけば、変数の使い方を整理でき、読みやすくてバグの少ないコードを書くことができるようになります。
また、変数の名前の付け方や場所の選び方も、スコープを理解しているかどうかで大きく変わってきます。
8. 変数のスコープとメモリの関係
少し進んだ話になりますが、スコープはメモリ(パソコンの記憶場所)とも関係があります。ローカル変数は、メソッドが実行されている間だけメモリに保存され、終わると消えます。
一方、クラスレベルの変数は、そのクラスのインスタンス(実体)がある間ずっとメモリに残っています。
このため、必要以上にグローバル変数を使うとメモリを無駄に使うことがあるので注意しましょう。