【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# の多くの挙動が自然に理解できるようになります。


訪問数 2 回, 今日の訪問数 2回

C#,参照型

Posted by hidepon