【C#入門】値型と参照型は「コピーを渡すか?住所を渡すか?」で完全に理解する
C# を学び始めて最初にぶつかる壁のひとつが、値型(Value Type) と 参照型(Reference Type) の違いです。
専門用語が多いため、難しく感じるかもしれません。
しかし本質はとてもシンプルです。
「コピーを渡しているのか?」
「それとも実体の住所(リンク)を渡しているのか?」
この違いを理解するだけで、値型と参照型の振る舞いは一気に分かりやすくなります。
1. 値型と参照型の違いは「コピー」か「住所」か
まずは結論を押さえましょう。
| 種類 | 渡すもの | 特徴 |
|---|---|---|
| 値型(Value Type) | 実体そのものの コピー | コピー同士は完全に独立。互いに影響しない |
| 参照型(Reference Type) | 実体がある場所の 住所(リンク) | 同じ実体を共有。変更が全員に伝わる |
この違いを理解するだけで、後の挙動もすべて説明できます。
2. 値型:データの「コピー」を渡す仕組み
値型には int、float、bool、struct などが含まれます。
2-1. 例え話:地図のコピーを渡すイメージ
あなたが地図を持っていて、友人に「この地図を渡すよ」と言ったとします。
- あなたの地図(地図A)
- 友人が受け取った地図(地図AのコピーB)
つまり 2つの独立した地図 が存在します。
友人がコピーBにメモを書いても、あなたの地図Aには一切影響しません。
「コピーは別物」
これが値型の基本です。
2-2. コード例(値型は独立)
int a = 5;
int b = a; // 値をコピー
b = 10;
Console.WriteLine(a); // 5(a は変わらない)
b は a のコピーなので、変更しても元には影響しません。
3. 参照型:データの「住所(リンク)」を渡す仕組み
参照型には class、配列(array)、List、string(特殊だが参照型) などが含まれます。
3-1. 例え話:家の住所を渡すイメージ
あなたが家を持っていて、友人に「この家を使っていいよ」と言ったとします。
実際の家は 1つだけですが、
- あなたも
- 友人も
同じ家の住所を知っている 状態です。
友人が家具を動かすと、あなたが家に戻ったときにも同じように家具が移動しています。
「同じ実体を共有する」
これが参照型の特徴です。
3-2. コード例(参照型は変更が伝わる)
class Data { public int value; }
Data a = new Data();
a.value = 5;
Data b = a; // 住所(リンク)をコピー
b.value = 10;
Console.WriteLine(a.value); // 10
a と b は同じ実体を参照しているため、b の変更が a に反映されます。
4. 図で理解する:コピー vs 住所

5. Unity で多発する誤解も、これで説明できる
Unity を学習していると、値型・参照型の違いが原因でハマる場面がよくあります。
5-1. Vector3 は struct(値型) → コピーが返る
transform.position.x = 5; // エラーになる
transform.position は struct(値型) なので、position を取り出した時点で “コピー” が返されます。
「コピーに対して X だけ書き換えようとしているのでエラー」
という仕組みです。
5-2. ScriptableObject は参照型 → 実行中の変更が保存される
ScriptableObject は参照型なので、すべての場所が同じ実体(アセット)を参照 します。
実行中に値を変えると、そのままアセットに反映される理由も、本記事の「住所を共有している」という説明で理解できます。
6. まとめ:理解のコアは1つだけ
- 値型はコピーを渡す → 独立して動く
- 参照型は住所を渡す → みんな同じものを見る
この考え方さえ抑えておけば、C# の多くの挙動が自然に理解できるようになります。




ディスカッション
コメント一覧
まだ、コメントがありません