ローカル変数とフィールドのちがい ― 「どこで宣言するか」で役割が決まる
プログラムの“データ置き場”は 「宣言する場所」で性格が一変します。
まずは ローカル変数=その場限り/フィールド=オブジェクトの記憶 という軸を押さえるだけで、「どこに値を入れるべきか」で迷わなくなります。以下の早見表は、その違いを最短ルートで理解するためのメモです。
ローカル変数 | フィールド | |
---|---|---|
宣言場所 | メソッド/プロパティ/ブロック内 | クラス・構造体の直下(メンバー レベル) |
スコープ | 宣言した { } ブロック内だけ | クラス全体(アクセス修飾子で外部公開も可) |
ライフサイクル | メソッドの実行中だけ存在(呼び出しごとに作り直し) | オブジェクト(または型)が生きている間ずっと保持 |
用途 | 一時的な計算・中間値を置く | そのオブジェクトの「状態」を覚えておく |
並列安全性 | 各呼び出しで独立(スレッド衝突しにくい) | 同じオブジェクト/型から同時に読まれる可能性あり |
命名規約(典型) | camelCase | _camelCase(private) / s_camelCase(static) |
1. ローカル変数 ― メソッドの作業台
- 毎回まっさら: メソッドを呼ぶたびに新しく作って終わると捨てる
- 外から見えない: メソッドの外では存在しない
- 目的: 計算途中の一時値や、引数を加工した結果を一時保存
void PrintSquare(int number)
{
int square = number * number; // ← ローカル変数
Console.WriteLine(square);
} // square はここで消える
2. フィールド ― オブジェクトの記憶装置
- クラスのメンバー: クラス全体で宣言し、どのメソッドからも参照できる
- インスタンス vs. static
- インスタンス フィールド : オブジェクトごとに別々の値を持つ
- 静的フィールド : クラスで 1 つだけ共有する値
- カプセル化が大事: public でむき出しにせず、プロパティ経由で操作するのが基本
public class Counter
{
private int _count = 0; // インスタンス フィールド
private static int s_total = 0; // 静的フィールド(全インスタンス共有)
public void Increment()
{
_count++; // 自分専用のカウント
s_total++; // みんなで共有する総数
}
public int Count => _count; // プロパティで公開
public static int Total => s_total; // 静的プロパティ
}
3. 使い分けの指さし確認
こんなとき | 使うのは? | 理由 |
---|---|---|
計算結果を画面に一度だけ出したい | ローカル変数 | メソッド外に持ち出す必要がない |
プレイヤーの HP や座標を保持したい | インスタンス フィールド | 同じクラスの複数オブジェクトで値が独立 |
作成したオブジェクトの合計数を数えたい | 静的フィールド | 全インスタンスで共有したい |
4. よくある初学者のつまずき
悩み | 原因とヒント |
---|---|
メソッド外からローカル変数が見えない | スコープ外。必要ならフィールドか戻り値にする |
static メソッドでインスタンス フィールドを使えない | static からは static メンバーだけが直接見える |
並列処理でフィールドの値が壊れる | 複数スレッドが同じフィールドに同時書き込み → ロックや Interlocked を検討 |
目次
まとめ
- ローカル変数 = その場限りのメモ帳
- フィールド = オブジェクト(一式)の長期記憶
- static が付けば「みんなで共有」
- 公開するならプロパティ経由でカプセル化
これを意識すると、データを「どこに置くか」で悩んだときの判断基準がはっきりします。
訪問数 5 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません