カテゴリ: C# 更新日: 2026/04/26

C#の構造体(struct)とクラス(class)の違いを理解しよう

C#の構造体(struct)とクラス(class)の違いを理解しよう
C#の構造体(struct)とクラス(class)の違いを理解しよう

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

生徒

「C#のstruct(ストラクト)とclass(クラス)って、どう違うんですか?」

先生

「とても大切なポイントですね。構造体(struct)とクラス(class)は、C#でデータをまとめる方法ですが、それぞれ使い方や特徴が違いますよ。」

生徒

「パッと見は似てるのに、何がどう違うんですか?」

先生

「それでは、構造体(struct)とクラス(class)の違いを、わかりやすく例えながら説明していきましょう!」

1. 構造体(struct)とは?

1. 構造体(struct)とは?
1. 構造体(struct)とは?

構造体(struct)は、値型(value type)に分類されるデータ型で、データそのものを「直接持つ」性質があります。初心者の方は、まず「構造体はその場に実体を持つ箱」であるとイメージすると理解しやすくなります。座標やサイズのように、小さくてまとまった情報を扱うときに特に向いています。

たとえば、X座標とY座標を管理したい場合、次のように構造体を使って表現できます。


struct Point
{
    public int X;
    public int Y;
}

実際にこの構造体を使って値を設定してみましょう。


Point p1 = new Point();
p1.X = 10;
p1.Y = 20;

構造体は値型であるため、別の変数に代入した瞬間に「データが丸ごとコピー」されます。以下の例を見ると、その違いがより分かりやすくなります。


Point p2 = p1;  // ここで p1 の値がコピーされる
p2.X = 99;
Console.WriteLine(p1.X); // 結果は10のまま

10

この例では、p2のXを変更してもp1には一切影響がありません。これは、p1とp2が「別々の箱」を持っているためです。同じ構造であっても、それぞれ独立して動くという特徴が、構造体の大きなポイントです。軽量データを扱う際に扱いやすい理由もここにあります。

2. クラス(class)とは?

2. クラス(class)とは?
2. クラス(class)とは?

クラス(class)は、参照型(reference type)と呼ばれるデータ型で、データ本体ではなく「データがある場所の住所」を持つ仕組みです。初心者の方は、まずクラスを「本体は別の場所にあり、変数はその場所を指し示すメモのようなもの」とイメージすると理解しやすくなります。複数の情報をまとめて持たせたい場面や、動作(メソッド)を一緒に扱いたいときに特に使われます。

たとえば、座標をクラスで表現すると次のようになります。


class PointClass
{
    public int X;
    public int Y;
}

実際にクラスのインスタンスを作り、値を設定してみましょう。


PointClass pc1 = new PointClass();
pc1.X = 10;
pc1.Y = 20;

クラスは参照型のため、別の変数に代入すると「データ本体を共有する」動きになります。次の例を見ると、その特徴がよく分かります。


PointClass pc2 = pc1; // pc1 と同じデータを参照する
pc2.X = 99;
Console.WriteLine(pc1.X); // 結果は99

99

この例でpc2のXの値を変更すると、pc1のXも同じように変わってしまいます。これは、両方の変数が「同じ本体(同じ住所のデータ)」を指しているためです。構造体(値型)とは異なり、クラスは複数の変数から1つのデータを共有して扱える点が特徴で、大きなデータ構造や複雑な処理を扱いたいときに役立ちます。

3. 値型と参照型の違いをもっとやさしく解説

3. 値型と参照型の違いをもっとやさしく解説
3. 値型と参照型の違いをもっとやさしく解説

ここでは、構造体(struct)とクラス(class)の理解に欠かせない「値型」と「参照型」の違いを、イメージしやすい例えを交えながら整理してみましょう。

まず、構造体(値型)は「自分専用のお弁当箱」を持っているイメージです。自分の弁当の中身(ご飯やおかず)を入れ替えても、そのお弁当はあくまで自分のものなので、他の人のお弁当には何の影響もありません。

一方で、クラス(参照型)は「みんなで共有しているお弁当の場所(住所)」をメモしているイメージです。複数人が同じお弁当の場所をメモしていて、そのお弁当箱の中身を誰かが変更すると、その場所を指している人全員が同じ変化を目で見ることになります。

  • 値型: 弁当そのものを渡す(中身を変えても、自分の分だけ変わる)。
  • 参照型: 弁当のありかを書いたメモを渡す(中身を変えると、見ている人全員に影響する)。

この違いを、実際のC#のコードでも少しだけ確かめてみましょう。ここでは、値型のintと、参照型のint[](配列)で挙動の違いを見てみます。


void ChangeValue(int x)
{
    x = 999;   // 値型のコピーを書き換えているだけ
}

void ChangeArray(int[] arr)
{
    arr[0] = 999; // 参照先の配列そのものを書き換える
}

int a = 10;
int[] b = { 10, 20 };

ChangeValue(a);
ChangeArray(b);

Console.WriteLine(a);    // 10 のまま
Console.WriteLine(b[0]); // 999 に変わる

10
999

この結果から分かるように、値型であるintはメソッドに渡した時点で「値のコピー」が使われるため、aの元の値は変わりません。一方で、配列(参照型)は「中身がある場所」を共有しているため、メソッド内で書き換えると呼び出し元にもそのまま影響します。

構造体(値型)はこのintのような動き、クラス(参照型)は配列のような動きに近いイメージです。まずは「自分専用のお弁当(値型)」と「みんなで共有するお弁当の場所(参照型)」という感覚を押さえておくと、後の構造体とクラスの違いもぐっと理解しやすくなります。

4. 構造体(struct)とクラス(class)の主な違い

4. 構造体(struct)とクラス(class)の主な違い
4. 構造体(struct)とクラス(class)の主な違い
項目 構造体(struct) クラス(class)
型の種類 値型 参照型
データの格納 直接中に入る アドレス(場所)を通じて操作
メモリの使用 スタック領域 ヒープ領域
継承 できない できる
用途 軽量なデータ構造(座標・サイズなど) 複雑なオブジェクト(ユーザー情報・商品など)

5. いつ構造体を使い、いつクラスを使う?

5. いつ構造体を使い、いつクラスを使う?
5. いつ構造体を使い、いつクラスを使う?

構造体とクラスは、それぞれ向いている使い方があります。

  • 構造体は、サイズが小さく、処理が軽いデータに使うと効率的です。
  • クラスは、複雑な動作やたくさんのデータを扱うときに向いています。

たとえば、ゲームで「敵キャラの位置」をたくさん扱うときはstruct。ユーザーの情報(名前、パスワード、設定など)を扱うときはclassが向いています。

6. 初心者が混乱しやすいポイントを整理しよう

6. 初心者が混乱しやすいポイントを整理しよう
6. 初心者が混乱しやすいポイントを整理しよう

初心者が間違いやすいのは、「見た目が似ているから同じように使える」と思ってしまうことです。

でも、代入やメモリの使われ方がまったく違うため、正しい理解が必要です。

実際のコードで動作を比べてみることで、体感的に違いがわかってきます。

まとめ

まとめ
まとめ

C#における構造体(struct)とクラス(class)の違いは、見た目は似ていても、実際には根本的に異なる特性を持っています。構造体は値型であり、メモリ上の扱いが軽量なため、小規模で単純なデータ構造に適しています。一方、クラスは参照型であり、柔軟性と拡張性に優れるため、大規模で複雑なオブジェクトに適した設計となっています。

特に重要なのは、構造体は代入時にデータがコピーされ、クラスは同じアドレスを参照するという挙動の違いです。この違いが実際のアプリケーションで不具合や予期せぬ挙動を引き起こすこともあるため、しっかり理解して使い分ける必要があります。

また、構造体は継承ができないという制約もあるため、複雑な継承関係やポリモーフィズムが必要な場面ではクラスの使用が前提となります。逆に、単純な座標やサイズなど、構造が小さく頻繁に生成されるようなデータには構造体の方がパフォーマンス面で有利です。

このように、用途に応じて適切な型を選ぶことが、効率的で保守性の高いプログラムを書くための第一歩です。

実践的な使い分け例

以下は、構造体とクラスを適切に使い分けた例です。


// 構造体:単純な座標データ
struct Position
{
    public int X;
    public int Y;
}

// クラス:複雑なユーザー情報
class User
{
    public string Name;
    public string Email;
    public string Password;
    public Position Location; // 構造体をプロパティとして利用
}

このように、構造体は部分的なデータ構造としてクラスに組み込むこともでき、使い方次第で高い柔軟性を発揮します。

まとめとしてのポイント再確認

  • 構造体(struct)は値型。コピーされる。メモリはスタック。
  • クラス(class)は参照型。共有される。メモリはヒープ。
  • 構造体は継承不可、クラスは継承可能。
  • 用途に応じた使い分けが重要。
  • 初心者が混乱しやすい代入の違いは、実際の動作で確認するのが効果的。
先生と生徒の振り返り会話

生徒

「先生、今日は構造体とクラスの違いがよくわかりました!構造体は値型、クラスは参照型ですね!」

先生

「その通りです!見た目は似ていても、挙動やメモリの使い方が大きく異なるので注意が必要ですよ。」

生徒

「代入するときの動きが特に混乱しそうですけど、実際にコードを書いて試したら理解できました!」

先生

「そうですね。コードを動かすことが一番の学びです。あと、構造体は小さなデータに向いていて、クラスは複雑なデータや機能を持つときに使うという使い分けも覚えておくと便利ですよ。」

生徒

「ゲームの座標には構造体、ユーザー情報にはクラス…って感じですね!」

先生

「その通り!これからも、状況に応じて最適な型を選べるようになっていきましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#の構造体structとクラスclassの違いを初心者向けに分かりやすく知りたいです

C#のstructは値型でデータを直接保持し、classは参照型でデータの場所(アドレス)を保持します。同じような見た目でも、メモリの扱いや動作が大きく異なります。

構造体structが値型というのはどういう意味ですか?

値型というのは、変数の中にデータそのものが入っていることを指します。別の変数に代入するとコピーが作られるので、元のデータは変わりません。
カテゴリの一覧へ
新着記事
New1
COBOL
COBOLのデバッグ方法を徹底解説!初心者向けDISPLAY活用ガイド
New2
C#
C#のLINQでグループ化と集計!GroupByとCountを初心者向けに解説
New3
C#
C#のシングルトンパターン実装方法と注意点を徹底解説!初心者向け完全ガイド
New4
Azure
Azure WAFの誤検知を解消!除外リスト設定とチューニング方法を初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.2
Java&Spring記事人気No2
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.3
Java&Spring記事人気No3
C#
C#のbool型を完全解説!初心者でもわかるtrueとfalseの基本と使い方
No.4
Java&Spring記事人気No4
C#
C#のトランザクション処理を完全ガイド!初心者でもわかるCommit・Rollbackの使い方
No.5
Java&Spring記事人気No5
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.6
Java&Spring記事人気No6
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.7
Java&Spring記事人気No7
Azure
Azureストレージの冗長性比較!LRS/GRS/ZRSの選び方とコストの最適解を完全解説
No.8
Java&Spring記事人気No8
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド