失敗から学ぶ参照型とブレークポイント

— Visual Studio デバッガで「オブジェクトを指す」ってこういうこと


この記事でわかること

見出し学べる内容
1. 参照型変数のライフサイクルnull → new でインスタンス確保 → 参照コピー
2. NullReferenceException を再現してみよう失敗例から「何が起きたか」を体感
3. ブレークポイントで“インスタンスを指す”とはデバッガに映る this と参照先オブジェクト
4. デバッグ窓(Autos/Locals/Watch)の読み方値の変化を追って理解を深める
5. まとめ & 自習課題今日の要点と次のステップ

1. 参照型変数のライフサイクル

C# のクラスは 参照型

変数に入るのは“実体”ではなく 参照(ポインタのような情報) です。

代表的な 3 ステップで振る舞いを整理しておきましょう。

  1. 宣言直後 参照は null。
  2. new 実行後 ヒープにオブジェクトが確保され、参照がその場所を指す。
  3. 参照コピー 別変数へ代入しても“指し示すアドレス”は同じ。

2. NullReferenceException を再現してみよう

まずはあえて失敗例を作り、エラーと向き合います。

class Person
{
    public string Name;

    public void IntroduceSelf()
    {
        Console.WriteLine(Name);
    }
}

class Program
{
    static void Main()
    {
        Person p = null;                                // ★ まだ実体なし
        Console.WriteLine($"宣言直後: p == null → {p == null}");

        p.IntroduceSelf();                              // ★ ここで例外!
    }
}

何が起きる?

  • 行 19 でブレークポイントを置いて実行 → 赤丸に黄色矢印
  • 例外ダイアログ: System.NullReferenceExceptionオブジェクト参照がオブジェクト インスタンスに設定されていません。

ポイント

  • p が null のままメソッドを呼ぼうとした。
  • デバッガの [自動] や [ローカル] ウィンドウでも p = null と表示される。

3. ブレークポイントで“インスタンスを指す”とは

次に正しい手順でインスタンスを生成し、ブレークポイントを再度確認します。

Person p = new Person { Name = "太郎" };   // ★ ヒープ上に確保
p.IntroduceSelf();                        // ★ ブレークポイント
  1. 上の2行目(p. でブレークポイント。
  2. 続行(F5)→ Personオブジェクト の IntroduceSelf() 内で停止。

ここが注目点!

デバッガウィンドウ表示例意味
自動 / ローカルp  → {ReferenceTypeRuntimeSample.Person}Name → “太郎"p はヒープ上の Person を指している
自動プロパティポップアップName = “太郎"参照先オブジェクトのフィールド値
[自動] this{ReferenceTypeRuntimeSample.Person}メソッド内での 自分自身

ブレークポイントは「この行が実行される直前」で止まる。

その時点で this が実体を持つ ことが目で確認できます。


4. デバッグ窓の読み方ミニレクチャー

特徴使いどころ
自動直前・直後に関わる変数を自動表示まずはここをチラ見
ローカル現在のスコープの全ローカル変数null チェックや参照先の確認
ウォッチ自分で追加した式を常時監視p == q など比較式を入れてもOK

ワンポイント

  • 参照をコピーした後 Person q = p;、Watch 窓に p == q を入れると true。
  • p と q の Name を書き換えて値が同時に変わる様子も必見。

5. まとめ & 自習課題

今日の要点

  1. null のままメソッドを呼ぶと必ず落ちる
  2. ブレークポイントで停止した瞬間、this やローカル変数が“どのオブジェクトを指しているか” をデバッガが教えてくれる。
  3. 参照コピーはアドレス共有。書き換えは互いに影響する。

自習課題

  • 練習 1 Person に Age も追加し、0 歳なら警告を出すロジックを実装。Age を設定し忘れた場合にデバッガで値を確認してみよう。
  • 練習 2 p = null; に戻し、null 条件演算子 p?.IntroduceSelf(); を使うとどうなるか観察。
  • 練習 3 Watch 窓で System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(p)を追加し、参照コピー前後のハッシュコードを比較してみる。

さらに深めたい人へ

  • ステップ実行 (F10 / F11) で行単位・メソッド内部を追ってみよう。
  • QuickWatch (Shift+F9) で即席評価。
  • 条件付きブレークポイント (p == null で停止など) も便利。

プログラムは「動かして・止めて・覗く」ことで腑に落ちる

ぜひブレークポイントを味方に付け、参照型の挙動を可視化してみてください。

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