基礎から学ぶC#入門 90日コース | 制御構文・メソッド - Day 18:スコープ

Web APP 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 18 のゴールと全体像

Day 18 では、プログラムを書くうえでとても重要なのに、最初は少しイメージしづらいテーマである スコープ(有効範囲) を学びます。

学ぶ内容は次の 3 つです。

  • ローカル変数
  • ブロックスコープ
  • 変数の有効範囲

これらは、

「どこで宣言した変数が、どこまで使えるのか」

を決めるルールです。 スコープを理解しておくと、予期しないバグや名前の衝突を防ぐことができるようになります。

ローカル変数とは

メソッドの中だけで使う変数

ローカル変数とは、

メソッドの中で宣言され、そのメソッドの中だけで使える変数

のことです。

例えば、次のようなコードを考えてみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int x = 10; // Main メソッドのローカル変数

        Console.WriteLine($"x の値:{x}");

        Console.ReadLine();
    }
}
C#

ここで宣言されている x は、Main メソッドの中だけで有効です。 別のメソッドからは、x を直接使うことはできません。

static void OtherMethod()
{
    // ここで x を使おうとするとコンパイルエラーになります
    // Console.WriteLine(x); // ← エラー
}
C#

重要ポイント:

  • ローカル変数は「そのメソッドの中だけで使える変数」です。
  • メソッドの外からは見えませんし、使えません。
  • これは「変数のスコープ(有効範囲)」の基本的なルールです。

ブロックスコープとは

{ } で囲まれた「かたまり」がスコープを作る

C# では、

{ } で囲まれた部分(ブロック)が、変数の有効範囲を決める単位

になります。

例えば、次のようなコードを見てみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int x = 10; // Main メソッドのブロック内で有効

        if (x > 5)
        {
            int y = 20; // if ブロックの中だけで有効
            Console.WriteLine($"x:{x}, y:{y}");
        }

        // ここでは y は使えません(if ブロックの外だから)
        // Console.WriteLine(y); // ← エラー

        Console.ReadLine();
    }
}
C#

ここでのポイントは、

  • x は Main メソッドのブロック { ... } の中で有効
  • yif (x > 5) { ... } のブロックの中だけで有効

ということです。

ブロックスコープのイメージ

  • 外側のブロックで宣言された変数は、内側のブロックからも見えます。
  • 内側のブロックで宣言された変数は、外側からは見えません。

図でイメージすると、

  • 大きな箱(メソッド全体)の中に、小さな箱(if や for のブロック)がある
  • 大きな箱の中のものは、小さな箱からも見える
  • 小さな箱の中のものは、大きな箱からは見えない

という感じです。

変数の有効範囲を具体的に見る

例1:for 文の中で宣言した変数

using System;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"ループ中の i:{i}");
        }

        // ここでは i は使えません(for の外だから)
        // Console.WriteLine(i); // ← エラー

        Console.ReadLine();
    }
}
C#

この場合、ifor 文のブロックの中だけで有効です。

  • ループの中では i を使えます。
  • ループが終わった後(for の外)では、i は存在しないものとして扱われます。
using System;

class Program
{
    static void Main(string[] args)
    {
        int value = 10;
        Console.WriteLine($"外側の value:{value}");

        {
            // 内側のブロックで同じ名前の変数を宣言
            int value = 20; // ← 実際にはこれはコンパイルエラーになります(同じスコープ内での重複宣言)

            Console.WriteLine($"内側の value:{value}");
        }

        Console.ReadLine();
    }
}
C#

例2:内側のブロックで同じ名前の変数を宣言する

C# では、同じスコープ内で同じ名前の変数を宣言することはできません。 上の例はエラーになります。

ただし、次のように「別のメソッド」で同じ名前を使うことはできます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int value = 10;
        Console.WriteLine($"Main の value:{value}");

        OtherMethod();

        Console.ReadLine();
    }

    static void OtherMethod()
    {
        int value = 20;
        Console.WriteLine($"OtherMethod の value:{value}");
    }
}
C#

ここでは、

  • Mainvalue
  • OtherMethodvalue

は、別々のスコープに属する別の変数です。

スコープを意識する理由

「どこからでも触れる変数」は危険

スコープを意識せずに変数を使っていると、

  • どこからでも値を書き換えられる
  • 意図しない場所で値が変わってしまう
  • バグの原因が分かりにくくなる

といった問題が起きやすくなります。

逆に、

「この変数は、この範囲でしか使えない」

というルールを守ることで、

  • 変数の役割がはっきりする
  • 間違った場所から触れられなくなる
  • コードの見通しがよくなる

というメリットがあります。

セキュリティの観点からも大事

スコープは、セキュリティの観点からも重要です。

  • 機密性の高い情報(パスワード、トークンなど)は、必要な範囲だけで扱う
  • 不要に広いスコープに置かない(どこからでもアクセスできる状態にしない)

といった意識を持つことで、情報漏えいのリスクを減らすことができます

練習テンプレート:スコープを意識したコード

入力・処理・表示でスコープを分ける

using System;

class Program
{
    static void Main(string[] args)
    {
        // 入力スコープ
        Console.WriteLine("整数を入力してください:");
        int number = int.Parse(Console.ReadLine());

        // 処理スコープ(ここでは単純に 2 倍にします)
        int doubled = DoubleNumber(number);

        // 表示スコープ
        Console.WriteLine($"元の値:{number}");
        Console.WriteLine($"2倍の値:{doubled}");

        Console.ReadLine();
    }

    // number の 2 倍を返すメソッド
    static int DoubleNumber(int number)
    {
        // このメソッドの中では、引数 number とローカル変数だけが有効です
        int result = number * 2;
        return result;
    }
}
C#

ここでは、

  • Main の中の変数 numberdoubled は、Main のスコープ内だけで有効です。
  • DoubleNumber の中の number(引数)と result は、DoubleNumber のスコープ内だけで有効です。

同じ名前 number が出てきますが、

  • Mainnumber
  • DoubleNumbernumber

は、別々のスコープに属する別の変数です。

スコープを確認する簡単な練習

「ここでは使える?使えない?」を自分で考えてみる

次のようなコードを見て、

「この変数はどこで使えるか?」

を自分で考えてみる練習をすると、スコープの感覚が早く身につきます。

using System;

class Program
{
    static void Main(string[] args)
    {
        int a = 10;

        if (a > 5)
        {
            int b = 20;
            Console.WriteLine($"a:{a}, b:{b}");
        }

        for (int i = 0; i < 3; i++)
        {
            int c = i * 2;
            Console.WriteLine($"i:{i}, c:{c}");
        }

        Console.ReadLine();
    }
}
C#
  • a はどこで使えるか?
  • b はどこで使えるか?
  • i はどこで使えるか?
  • c はどこで使えるか?

といったことを、**ブロック { } を意識しながら考えてみると、 スコープのルールが自然に理解できるようになります。

Day 18 のまとめ

Day 18 では、

  • ローカル変数:メソッドの中だけで使える変数
  • ブロックスコープ:{ } で囲まれた範囲が変数の有効範囲を決める
  • 変数の有効範囲:どこで宣言した変数が、どこまで使えるか

という 3 つの軸で、スコープ(有効範囲)の考え方を学びました。

スコープは、

「変数がどこから見えるか、どこから触れるか」

を決める、とても大事なルールです。

ぜひ、

  • 自分のコードの { } を意識して、「この変数はどこまで有効か?」と考えてみる
  • メソッドごとに「この中でしか使わない変数」をローカル変数として宣言する
  • 不要に広いスコープに変数を置かないように意識する

といった練習を通して、「スコープを意識した安全で読みやすいコード」を書く力を育てていってください。

タイトルとURLをコピーしました