C#の参照型と値型の違いを初心者向けにやさしく解説!
生徒
「C#には“値型”と“参照型”ってあると聞いたんですが、どう違うんですか?」
先生
「とても大事なポイントですね。プログラムでデータを扱うとき、“データそのもの”を持つか、“データの場所”を持つかの違いがあるんです。」
生徒
「えっ? “場所”ってどういうことですか?」
先生
「それでは、C#の“値型”と“参照型”について、順番にやさしく解説していきましょう!」
1. C#の値型とは?
まず、値型(value type)は、「データそのもの」を変数に保持する型です。たとえば、数字や文字などがこれに当たります。
代表的な値型は、int
(整数)やdouble
(小数)、bool
(真偽値)などです。
例えるなら、値型は「お菓子を直接持っている」イメージです。箱の中にチョコレートが入っているなら、その箱を渡せばチョコも一緒に渡ったことになります。
次のコードで、値型がコピーされる動きを見てみましょう。
int x = 10;
int y = x; // xの値をyにコピー
y = 20;
Console.WriteLine(x); // 10
Console.WriteLine(y); // 20
この場合、y
にx
の値をコピーしているので、その後y
を変更してもx
には影響がありません。
2. C#の参照型とは?
次に、参照型(reference type)は、「データがある場所(メモリの住所)」を変数が覚えている型です。中身ではなく“どこにあるか”を知っているということです。
代表的な参照型には、string
(文字列)や配列
、クラス
があります。
例えるなら、参照型は「お菓子が置いてある棚の地図を持っている」イメージです。その地図をコピーすれば、同じ棚を指しているので、片方が変わるともう片方も変わります。
int[] array1 = { 1, 2, 3 };
int[] array2 = array1; // array1の参照をarray2にコピー
array2[0] = 99;
Console.WriteLine(array1[0]); // 99
Console.WriteLine(array2[0]); // 99
このように、array2
を変更するとarray1
にも影響が出るのは、どちらも同じ場所を参照しているからです。
3. 値型と参照型の代表例
代表的な型を表でまとめました:
分類 | 型の例 | 特徴 |
---|---|---|
値型 | int, double, bool, char, struct | データそのものを保持、コピーで独立 |
参照型 | string, 配列, クラス, オブジェクト | データの場所を保持、共有される |
4. メモリの使い方の違い
値型と参照型では、メモリの使い方にも違いがあります。
- 値型:スタック(stack)と呼ばれる場所に保存されます。高速で一時的な保存向きです。
- 参照型:ヒープ(heap)と呼ばれる場所に保存されます。大きなデータや長く使うデータに向いています。
スタックとヒープはパソコンのメモリの管理方法の違いで、スタックはすぐにアクセスできますが容量は小さめ。ヒープは大きいですが、少し時間がかかります。
5. よくある落とし穴に注意!
参照型でコピーをしたつもりが、実は同じ場所を指していて、元のデータまで変わってしまうことがあります。
この違いを知らずにプログラムを作ると、「なんで勝手に変わったの?」と混乱することもあります。
初心者のうちは「数値などは値型」「配列や文字列は参照型」と覚えておくとよいでしょう。
6. クラス(class)と構造体(struct)の違いもここに関係
C#には「クラス(class)」と「構造体(struct)」という型がありますが、これも実はこの話と関係があります。
・class(クラス):参照型
・struct(構造体):値型
クラスを使うと、オブジェクトを共有できる便利さがありますが、変更の影響にも注意が必要です。構造体はコピーされるので、安全に使いたいときに向いています。
7. 値型か参照型かを判断する方法
C#で変数が値型か参照型かを確認するには、GetType()
やtypeof()
などのメソッドを使って調べることができます。
また、構文としては以下のようにすれば判断できます:
int x = 5;
Console.WriteLine(x.GetType()); // System.Int32
string s = "Hello";
Console.WriteLine(s.GetType()); // System.String