失敗から学ぶ参照型とブレークポイント
— Visual Studio デバッガで「オブジェクトを指す」ってこういうこと
目次
この記事でわかること
見出し | 学べる内容 |
---|---|
1. 参照型変数のライフサイクル | null → new でインスタンス確保 → 参照コピー |
2. NullReferenceException を再現してみよう | 失敗例から「何が起きたか」を体感 |
3. ブレークポイントで“インスタンスを指す”とは | デバッガに映る this と参照先オブジェクト |
4. デバッグ窓(Autos/Locals/Watch)の読み方 | 値の変化を追って理解を深める |
5. まとめ & 自習課題 | 今日の要点と次のステップ |
1. 参照型変数のライフサイクル
C# のクラスは 参照型。
変数に入るのは“実体”ではなく 参照(ポインタのような情報) です。
代表的な 3 ステップで振る舞いを整理しておきましょう。
- 宣言直後 参照は null。
- new 実行後 ヒープにオブジェクトが確保され、参照がその場所を指す。
- 参照コピー 別変数へ代入しても“指し示すアドレス”は同じ。
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(); // ★ ブレークポイント
- 上の2行目(p. でブレークポイント。
- 続行(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. まとめ & 自習課題
今日の要点
- null のままメソッドを呼ぶと必ず落ちる。
- ブレークポイントで停止した瞬間、this やローカル変数が“どのオブジェクトを指しているか” をデバッガが教えてくれる。
- 参照コピーはアドレス共有。書き換えは互いに影響する。
自習課題
- 練習 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 回, 今日の訪問数 15回
ディスカッション
コメント一覧
まだ、コメントがありません