カテゴリ: C# 更新日: 2025/06/17

C#のスコープとは?ローカル変数とグローバル変数の違いと使い分けを徹底解説!

C#のスコープとは?ローカル変数・グローバル変数の違いと使い分け
C#のスコープとは?ローカル変数・グローバル変数の違いと使い分け

先生と生徒の会話形式で理解しよう

生徒

「C#で変数を使っているんですけど、ある場所では使えるのに、別のところではエラーが出るのはなぜですか?」

先生

「それは『スコープ(scope)』が関係しているかもしれません。スコープとは、変数が使える範囲のことを意味します。」

生徒

「なるほど…。それってローカル変数とかグローバル変数と関係があるんですか?」

先生

「はい、関係大アリです!では、C#のスコープについて一緒に見ていきましょう。」

1. スコープとは?C#の変数の使える範囲

1. スコープとは?C#の変数の使える範囲
1. スコープとは?C#の変数の使える範囲

プログラミング言語のC#(シーシャープ)では、「スコープ」という考え方がとても大切です。スコープとは、その変数が使える範囲のことです。たとえば、家の中でしか使えないリモコンと、どこでも使えるスマートフォンのような違いがあります。

スコープが正しく理解できていないと、「この変数はどこから来たの?」「使えないって言われる…」と混乱しがちです。C#では主に、ローカル変数グローバル変数(※正確にはクラスレベルの変数)があります。

2. ローカル変数とは?

2. ローカル変数とは?
2. ローカル変数とは?

ローカル変数とは、特定のブロック(かたまり)の中だけで使える変数のことです。ブロックとは、波かっこ { } で囲まれた範囲のことです。例えば、メソッド(関数)の中や、if文の中などがそうです。

では、実際にローカル変数の例を見てみましょう。


void SampleMethod()
{
    int number = 10; // これはローカル変数
    Console.WriteLine(number);
}

このnumberという変数は、SampleMethodの中でしか使えません。外のコードからこの変数にアクセスしようとするとエラーになります。

3. グローバル変数とは?(クラスレベルの変数)

3. グローバル変数とは?(クラスレベルの変数)
3. グローバル変数とは?(クラスレベルの変数)

実は、C#には「完全なグローバル変数」はありません。しかし、クラスの中で定義された変数を「グローバル変数」と呼ぶことがあります。

これは、そのクラスのすべてのメソッドから使える変数です。以下の例を見てみましょう。


class MyClass
{
    int count = 0; // クラスレベルの変数(グローバル変数のようなもの)

    void AddCount()
    {
        count = count + 1;
        Console.WriteLine(count);
    }

    void ResetCount()
    {
        count = 0;
    }
}

countという変数は、AddCountメソッドでもResetCountメソッドでも使えていますね。これがクラス全体で共有される変数、つまり「グローバル変数のようなもの」です。

4. ローカル変数とグローバル変数の違い

4. ローカル変数とグローバル変数の違い
4. ローカル変数とグローバル変数の違い

ここで、ローカル変数とグローバル変数(クラスレベルの変数)の違いを整理してみましょう。

  • ローカル変数:そのブロックの中だけで使える
  • グローバル変数:クラス全体で使える

もしローカル変数と同じ名前のグローバル変数があった場合は、ローカル変数が優先されます。

5. スコープの重なりと注意点

5. スコープの重なりと注意点
5. スコープの重なりと注意点

スコープが重なることもあります。つまり、同じ名前の変数が複数のスコープに存在すると、プログラムが混乱することがあります。


int number = 5; // クラスレベルの変数

void Sample()
{
    int number = 10; // ローカル変数(上の変数を「隠して」しまう)
    Console.WriteLine(number); // これは10と表示される
}

このように、ローカル変数がグローバル変数と同じ名前だと、グローバル変数は使えなくなります。これをシャドーイング(Shadowing)と言います。

6. 実行結果の例で確認しよう

6. 実行結果の例で確認しよう
6. 実行結果の例で確認しよう

では、スコープによって変数の使える範囲がどう変わるのか、実行結果で確認してみましょう。


class ScopeExample
{
    int globalValue = 100;

    void ShowValues()
    {
        int localValue = 50;
        Console.WriteLine("ローカル変数:" + localValue);
        Console.WriteLine("グローバル変数:" + globalValue);
    }
}

ローカル変数:50
グローバル変数:100

このように、メソッド内ではローカル変数とグローバル変数の両方を使い分けることができます。

7. なぜスコープを理解することが大切なのか?

7. なぜスコープを理解することが大切なのか?
7. なぜスコープを理解することが大切なのか?

プログラムを書くうえで、変数がどこで使えて、どこで使えないのかを理解していないと、予期せぬエラーバグ(間違った動作)の原因になります。

スコープをしっかり把握しておけば、変数の使い方を整理でき、読みやすくてバグの少ないコードを書くことができるようになります。

また、変数の名前の付け方や場所の選び方も、スコープを理解しているかどうかで大きく変わってきます。

8. 変数のスコープとメモリの関係

8. 変数のスコープとメモリの関係
8. 変数のスコープとメモリの関係

少し進んだ話になりますが、スコープはメモリ(パソコンの記憶場所)とも関係があります。ローカル変数は、メソッドが実行されている間だけメモリに保存され、終わると消えます。

一方、クラスレベルの変数は、そのクラスのインスタンス(実体)がある間ずっとメモリに残っています。

このため、必要以上にグローバル変数を使うとメモリを無駄に使うことがあるので注意しましょう。

関連記事:
カテゴリの一覧へ
新着記事
COBOLの変数名の付け方を解説!初心者でもわかる命名規則とコツ
C#のbreakとcontinueの使い方!ループ制御の基本テクニック
COBOLのFILLERの使い方とは?未使用領域を上手に管理する基本テクニック
C#のforeach文の基本!配列やコレクションを簡単に繰り返し処理する方法
人気記事
No.1
Java&Spring記事人気No1
COBOLのDISPLAY文の使い方を完全ガイド!初心者でもわかる出力方法
No.2
Java&Spring記事人気No2
C#のwhile文の使い方!条件付きループを基礎から学ぼう
No.3
Java&Spring記事人気No3
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方
No.4
Java&Spring記事人気No4
COBOLのINDEXED BY句を使ったインデックス管理の基本をやさしく解説!