ローカル変数とフィールドのちがい ― 「どこで宣言するか」で役割が決まる

プログラムの“データ置き場”は 「宣言する場所」で性格が一変します。

まずは ローカル変数=その場限り/フィールド=オブジェクトの記憶 という軸を押さえるだけで、「どこに値を入れるべきか」で迷わなくなります。以下の早見表は、その違いを最短ルートで理解するためのメモです。

ローカル変数フィールド
宣言場所メソッド/プロパティ/ブロック内クラス・構造体の直下(メンバー レベル)
スコープ宣言した { } ブロック内だけクラス全体(アクセス修飾子で外部公開も可)
ライフサイクルメソッドの実行中だけ存在(呼び出しごとに作り直し)オブジェクト(または型)が生きている間ずっと保持
用途一時的な計算・中間値を置くそのオブジェクトの「状態」を覚えておく
並列安全性各呼び出しで独立(スレッド衝突しにくい)同じオブジェクト/型から同時に読まれる可能性あり
命名規約(典型)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 を検討

まとめ

  1. ローカル変数 = その場限りのメモ帳
  2. フィールド = オブジェクト(一式)の長期記憶
  3. static が付けば「みんなで共有」
  4. 公開するならプロパティ経由でカプセル化

これを意識すると、データを「どこに置くか」で悩んだときの判断基準がはっきりします。

訪問数 5 回, 今日の訪問数 1回

C#

Posted by hidepon