C# 変数のスコープを理解する:クラス、メソッド、ブロックレベル
C# 変数のスコープを理解する
このガイドでは、C# における変数スコープの仕組みを、クラスレベル、メソッドレベル、ブロックレベルのスコープを明確な実例で解説します。
変数スコープは、コード内で変数にアクセスできる場所を決定します。C# では主に 3 つのスコープに遭遇します。
- クラスレベルスコープ
- メソッドレベルスコープ
- ブロックレベルスコープ
クラスレベル変数スコープ
クラス内でメソッドやコンストラクタの外側に変数を宣言すると、それはフィールドとなり、そのクラスのすべてのメンバーからアクセス可能になります。これを クラスレベルスコープ と呼びます。
using System;
namespace VariableScope {
class Program {
// クラスレベルフィールド
string str = "Class Level";
public void Display() {
Console.WriteLine(str);
}
static void Main(string[] args) {
Program ps = new Program();
ps.Display();
Console.ReadLine();
}
}
}
出力
Class Level
この例では str がフィールドであるため、Program クラス全体で、Display メソッドを含めて利用可能です。
重要な注意点: インスタンスフィールドは、インスタンスを使用しない限り static メソッドからアクセスできません。例:
static void Display2() {
// これはコンパイルエラーになる
Console.WriteLine(str);
}
メソッドレベル変数スコープ
メソッド内で宣言された変数はそのメソッドにローカルです。定義したメソッドの外部から参照できません。これを メソッドレベルスコープ と呼びます。
using System;
namespace VariableScope {
class Program {
public void Method1() {
// ローカル変数
string str = "method level";
}
public void Method2() {
// ここで str にアクセスしようとするとエラー
Console.WriteLine(str);
}
static void Main(string[] args) {
Program ps = new Program();
ps.Method2();
Console.ReadLine();
}
}
}
Method2 で str を使用しようとすると、コンパイラエラー:
Error CS0103: The name 'str' does not exist in the current context
逆に、同じメソッド内ではローカル変数を使用できます:
using System;
namespace VariableScope {
class Program {
public void Display() {
string str = "inside method";
Console.WriteLine(str);
}
static void Main(string[] args) {
Program ps = new Program();
ps.Display();
Console.ReadLine();
}
}
}
出力
inside method
C# におけるブロックレベル変数スコープ
ループ、if 文、その他のネストしたスコープなどのブロック内で宣言された変数は、そのブロック内でのみアクセス可能です。これを ブロックレベルスコープ と呼びます。
using System;
namespace VariableScope {
class Program {
public void Display() {
for (int i = 0; i <= 3; i++) {
// i はこの for ループ内に限定される
}
// Console.WriteLine(i); // ❌ コンパイルエラー
}
static void Main(string[] args) {
Program ps = new Program();
ps.Display();
Console.ReadLine();
}
}
}
ここではループカウンタ i はループ終了後に参照できません。スコープがブロックとともに終了するためです。
C言語
- C++ポインタをマスター:概念、例、実践的応用
- C 言語の変数、データ型、定数 – 実践ガイド
- C言語の変数を理解する:型、命名規則、メモリ管理
- C言語のスコープルール:ローカル、グローバル、仮パラメータの理解
- C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ
- C言語可変長引数のマスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- ゲートレベルモデリング:ハードウェア回路図からVerilogコードへ
- 任意のスコープでのVerilog timescale理解と表示
- Python globalキーワード完全マスター: 使い方とタイミング
- Java変数の種類:ローカル、インスタンス、クラス変数を徹底解説