カテゴリ: C# 更新日: 2025/07/02

C#の参照型と値型の違いを初心者向けにやさしく解説!

C#の参照型と値型の違いをわかりやすく解説
C#の参照型と値型の違いをわかりやすく解説

先生と生徒の会話形式で理解しよう

生徒

「C#には“値型”と“参照型”ってあると聞いたんですが、どう違うんですか?」

先生

「とても大事なポイントですね。プログラムでデータを扱うとき、“データそのもの”を持つか、“データの場所”を持つかの違いがあるんです。」

生徒

「えっ? “場所”ってどういうことですか?」

先生

「それでは、C#の“値型”と“参照型”について、順番にやさしく解説していきましょう!」

1. C#の値型とは?

1. 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

この場合、yxの値をコピーしているので、その後yを変更してもxには影響がありません。

2. C#の参照型とは?

2. C#の参照型とは?
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. 値型と参照型の代表例

3. 値型と参照型の代表例
3. 値型と参照型の代表例

代表的な型を表でまとめました:

分類 型の例 特徴
値型 int, double, bool, char, struct データそのものを保持、コピーで独立
参照型 string, 配列, クラス, オブジェクト データの場所を保持、共有される

4. メモリの使い方の違い

4. メモリの使い方の違い
4. メモリの使い方の違い

値型と参照型では、メモリの使い方にも違いがあります。

  • 値型:スタック(stack)と呼ばれる場所に保存されます。高速で一時的な保存向きです。
  • 参照型:ヒープ(heap)と呼ばれる場所に保存されます。大きなデータや長く使うデータに向いています。

スタックとヒープはパソコンのメモリの管理方法の違いで、スタックはすぐにアクセスできますが容量は小さめ。ヒープは大きいですが、少し時間がかかります。

5. よくある落とし穴に注意!

5. よくある落とし穴に注意!
5. よくある落とし穴に注意!

参照型でコピーをしたつもりが、実は同じ場所を指していて、元のデータまで変わってしまうことがあります。

この違いを知らずにプログラムを作ると、「なんで勝手に変わったの?」と混乱することもあります。

初心者のうちは「数値などは値型」「配列や文字列は参照型」と覚えておくとよいでしょう。

6. クラス(class)と構造体(struct)の違いもここに関係

6. クラス(class)と構造体(struct)の違いもここに関係
6. クラス(class)と構造体(struct)の違いもここに関係

C#には「クラス(class)」と「構造体(struct)」という型がありますが、これも実はこの話と関係があります。

class(クラス):参照型

struct(構造体):値型

クラスを使うと、オブジェクトを共有できる便利さがありますが、変更の影響にも注意が必要です。構造体はコピーされるので、安全に使いたいときに向いています。

7. 値型か参照型かを判断する方法

7. 値型か参照型かを判断する方法
7. 値型か参照型かを判断する方法

C#で変数が値型か参照型かを確認するには、GetType()typeof()などのメソッドを使って調べることができます。

また、構文としては以下のようにすれば判断できます:


int x = 5;
Console.WriteLine(x.GetType()); // System.Int32

string s = "Hello";
Console.WriteLine(s.GetType()); // System.String
カテゴリの一覧へ
新着記事
COBOLの変数名の付け方を解説!初心者でもわかる命名規則とコツ
C#のbreakとcontinueの使い方!ループ制御の基本テクニック
COBOLのFILLERの使い方とは?未使用領域を上手に管理する基本テクニック
C#のforeach文の基本!配列やコレクションを簡単に繰り返し処理する方法
人気記事
No.1
Java&Spring記事人気No1
COBOLのDISPLAY文の使い方を完全ガイド!初心者でもわかる出力方法
No.2
Java&Spring記事人気No2
C#のwhile文の使い方!条件付きループを基礎から学ぼう
No.3
Java&Spring記事人気No3
COBOLのINDEXED BY句を使ったインデックス管理の基本をやさしく解説!
No.4
Java&Spring記事人気No4
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方