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 メソッドのブロック{ ... }の中で有効yはif (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#この場合、i は for 文のブロックの中だけで有効です。
- ループの中では
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#ここでは、
MainのvalueOtherMethodのvalue
は、別々のスコープに属する別の変数です。
スコープを意識する理由
「どこからでも触れる変数」は危険
スコープを意識せずに変数を使っていると、
- どこからでも値を書き換えられる
- 意図しない場所で値が変わってしまう
- バグの原因が分かりにくくなる
といった問題が起きやすくなります。
逆に、
「この変数は、この範囲でしか使えない」
というルールを守ることで、
- 変数の役割がはっきりする
- 間違った場所から触れられなくなる
- コードの見通しがよくなる
というメリットがあります。
セキュリティの観点からも大事
スコープは、セキュリティの観点からも重要です。
- 機密性の高い情報(パスワード、トークンなど)は、必要な範囲だけで扱う
- 不要に広いスコープに置かない(どこからでもアクセスできる状態にしない)
といった意識を持つことで、情報漏えいのリスクを減らすことができます。
練習テンプレート:スコープを意識したコード
入力・処理・表示でスコープを分ける
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の中の変数numberとdoubledは、Main のスコープ内だけで有効です。DoubleNumberの中のnumber(引数)とresultは、DoubleNumber のスコープ内だけで有効です。
同じ名前 number が出てきますが、
MainのnumberDoubleNumberのnumber
は、別々のスコープに属する別の変数です。
スコープを確認する簡単な練習
「ここでは使える?使えない?」を自分で考えてみる
次のようなコードを見て、
「この変数はどこで使えるか?」
を自分で考えてみる練習をすると、スコープの感覚が早く身につきます。
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 つの軸で、スコープ(有効範囲)の考え方を学びました。
スコープは、
「変数がどこから見えるか、どこから触れるか」
を決める、とても大事なルールです。
ぜひ、
- 自分のコードの
{ }を意識して、「この変数はどこまで有効か?」と考えてみる - メソッドごとに「この中でしか使わない変数」をローカル変数として宣言する
- 不要に広いスコープに変数を置かないように意識する
といった練習を通して、「スコープを意識した安全で読みやすいコード」を書く力を育てていってください。
