📝
値型と参照型の本質
C# を理解する上で最も重要な基礎
■ 値型と参照型の違い(C# 基礎理解)
値型(Value Type):値そのものを保持する
参照型(Reference Type):アドレス(参照)を保持する
本質は「値がどこに保存され、コピー時に何が複製されるか」にあります。
■ Stack と Heap の基本
【Stack】
- スコープを抜けると自動削除
- 高速
- 小さいデータ向け
- 主に値型が置かれる
【Heap】
- GC により管理
- 割り当てコストは高め
- 主に参照型が置かれる
■ 値型(Value Type)
代表:int, double, bool, struct, enum
特徴:
- 値そのものがコピーされる
- 多くは Stack に配置される
※ ただし、参照型オブジェクトのフィールドとして配置される場合は Heap に置かれます。
例:
class Box { public int Number; }
→ Box は Heap 上。Number は値型だが場所は Heap。
■ 参照型(Reference Type)
代表:class, string, array, interface
特徴:
- コピーされるのはアドレス
- 複数の変数が同じオブジェクトを参照する
例:
var a = new Point(10, 20);
var b = a;
→ a と b は同じオブジェクトを参照
■ Boxing / Unboxing(性能に影響)
【Boxing】
値型 → 参照型 に変換されると Heap 上にボックス化されます
int x = 10;
object o = x; // boxing
【Unboxing】
参照型 → 値型 に戻すとき追加コストが発生
■ struct が軽量であるべき理由
struct は値型なので、コピーすると全体が複製される
→ 大きい struct は性能低下につながる
また、Immutable(不変)であると扱いやすく安全です。
推奨される struct の条件:
- 小さいサイズ(16byte 以下目安)
- 不変(Immutable)
- 単純なデータの集合
■ まとめ
- 値型:値を直接保持
- 参照型:アドレスを保持
- 最も重要な違いは「コピー時に何が複製されるか」です。
- struct は“小さく不変”がベスト
- boxing/unboxing は最小限に
Discussion