【Aモデル録 フェーズ1 C#基礎】
ここは、とても大事なポイントです。
ポイントが多すぎて、強調文字ばかりになりますが、それだけ大事。
ここを曖昧にすると全部崩れるので、違いを明確に覚えておきましょう。
| 違いのポイント | 値型(int, bool, struct) | 参照型(class, array, string) |
|---|---|---|
| 何を持つ? | 実体そのもの | 実体のアドレス |
| コピーしたら? | 別物が増える | 同じ実体を見る |
| 値が変更されたら? | 影響しない | 影響が波及する |
| 特徴 | 安全・直感的 | 良くも悪くも影響大・危険性が高い |
※ string は 参照型だけど特殊(今は深入りしない)
👉 値型は「内容のデータそのもの」を持つ
👉 参照型は「実体(内容のデータ)が”置いてある場所(アドレス/参照先)"」を持つ
これは大きな違いです。
しっかり押さえておきましょう。
int a = 10;
int b = a;
a → 10 をそのまま持つ
b → 10をコピー → 10 をそのまま持つ
a = 1 [a] → 10
b = a [b] → 10
👉 代入した時点で、完全に別物になる = それぞれに別個のデータを持つ
SeizoBu a = new SeizoBu("田中");
SeizoBu b = a;
a → 実体へのアドレスを持つ
b → aのアドレスをコピーし、独自に保持する → 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モデル的な理解しやすい表現をしておきます。
変数 = 実体
変数は「実体」か「実体への参照」のどちらかを持つ
| 型 | 変数の中身 |
|---|---|
| 値型 | 実体そのもの |
| 参照型 | 実体の置き場所(アドレス/参照先) |
小さいデータ
個別に扱いたい
勝手に変わってほしくない
👉 安全第一
大きいデータ
状態を共有したい
変更を反映させたい
👉 責任を持って設計する
new
↓
コンストラクタで初期化
↓
安全な状態を保証
↓
参照で共有
👉 初期状態が壊れてると、参照は地獄
だから、
コンストラクタが面倒
参照が怖い
この2つは 同じ根っこ。
値型は コピーの世界
参照型は 共有の世界
変数は
👉 実体か、実体への参照を持つ
参照は影響が強力
👉 だから設計が必要