📝

値型と参照型の本質

に公開

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