【Aモデル録 フェーズ1 C#基礎】

05-05-3:「値の世界」と「参照の世界」

ここは、とても大事なポイントです。

ポイントが多すぎて、強調文字ばかりになりますが、それだけ大事。

ここを曖昧にすると全部崩れるので、違いを明確に覚えておきましょう。


種類で整理

違いのポイント 値型(int, bool, struct) 参照型(class, array, string)
何を持つ? 実体そのもの 実体のアドレス
コピーしたら? 別物が増える 同じ実体を見る
値が変更されたら? 影響しない 影響が波及する
特徴 安全・直感的 良くも悪くも影響大・危険性が高い

※ string は 参照型だけど特殊(今は深入りしない)


一言で言うと

👉 値型は「内容のデータそのもの」を持つ
👉 参照型は「実体(内容のデータ)が”置いてある場所(アドレス/参照先)"」を持つ

これは大きな違いです。
しっかり押さえておきましょう。


まず「変数」が何を持っているか

値型の変数(int / bool / struct)

int a = 10;
int b = a;

a = 1    [a] → 10
b = a    [b] → 10

👉 代入した時点で、完全に別物になる = それぞれに別個のデータを持つ


参照型の変数(class / array / string)

SeizoBu a = new SeizoBu("田中");
SeizoBu b = a;

👉 コピーされたのは「実体」ではなく「参照(アドレス)」

    [a]
     ↓
[ SeizoBu(Name="田中") ]
     ↑
    [b]

👉 同じデータを、”2つ以上の変数がそれぞれに”見たり変更したりできる。


最大重要ポイント! 「再代入」した時の「違い」と「危険性」

値型と参照型は、再代入をした時、全く違う結果となります。

変数は、違いをしっかり認識して扱う。

これが鉄則です。

実践①(値型)

int x = 5;
int y = x;	// ここでは、yは5

y = 10;		// yに10を再代入

結果:

//「==」は、比較演算子”等しい”の意味
x == 5		// xは5のまま
y == 10		// yだけ10になる

👉 安全・直感的・お互いの影響なし


実践②(参照型)

SeizoBu a = new SeizoBu("田中");	// aは「田中」が保存してある場所の”アドレス”を持つ
SeizoBu b = a;				// bにaが持つ”アドレス”を教える

b.Name = "佐藤";			// bがアドレスを使って「佐藤」に書き換える

結果:

a.Name == "佐藤"	// aが見る(参照する)結果が変わる

👉 bが変更したのに、何もしていないaも変わる

これが 参照の正体。


「危険性」の正体

👉 参照は、「自分が触ってないのに変わる」可能性がある

危険なのは参照じゃない。
無自覚で参照を扱うことが危険。


Aモデル的解釈(混乱防止)

ここで、Aモデル的な理解しやすい表現をしておきます。

❌ よくある誤解

変数 = 実体

✅ 正確な理解

変数は「実体」か「実体への参照」のどちらかを持つ

型 変数の中身
値型 実体そのもの
参照型 実体の置き場所(アドレス/参照先)

実務での判断基準

値型を選ぶとき

👉 安全第一


参照型を選ぶとき

👉 責任を持って設計する


コンストラクタとセットで考える理由(再解説)

new
 ↓
コンストラクタで初期化
 ↓
安全な状態を保証
 ↓
参照で共有

👉 初期状態が壊れてると、参照は地獄

だから、

この2つは 同じ根っこ。


今日の最終着地点


構成と読み方|タイトル一覧

Top - はじめに|この忘備録と「Aモデル」について