本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第2章 型を表現する · レッスン14

struct(値型)

ブラウザで完結

導入

classが「参照型」なのに対し、struct値型です。座標や色のような小さくて頻繁に作られるデータを、軽量に扱うために使います。代入時の振る舞いがclassと異なる点が重要です。

図解

flowchart TB
    subgraph ref["class(参照型)"]
        C1["a"] -->|同じ実体を指す| OBJ["オブジェクト"]
        C2["b = a"] -->|同じ実体| OBJ
    end
    subgraph val["struct(値型)"]
        S1["a"] --- V1["値のコピー1"]
        S2["b = a"] --- V2["値のコピー2(独立)"]
    end

サンプル

var a = new Coord(1, 2);
var b = a;           // struct は「値のコピー」が渡される
b.X = 99;            // b を変えても…

Console.WriteLine(a.X);   // 1(a は影響を受けない=独立したコピー)
Console.WriteLine(b.X);   // 99

// struct: 小さな値のまとまりに使う
struct Coord
{
    public int X;
    public int Y;
    public Coord(int x, int y) { X = x; Y = y; }
}
  • struct値型:代入すると値がコピーされ、コピー先を変えても元は影響を受けない
  • class参照型:代入すると同じ実体を指し、片方の変更が両方に影響する
  • structは小さく頻繁に作られるデータ(座標・色・金額など)に向く

演習

var original = new Size(10, 20);
var copy = original;
copy.Width = 100;
Console.WriteLine($"{original.Width} {copy.Width}");   // 10 100

// TODO: Width と Height を持つ struct Size を定義してください(コンストラクタ付き)
___
  • 期待される出力: 10 100
ヒント1を見る

struct Size { public int Width; public int Height; public Size(int w, int h) { Width = w; Height = h; } }

ヒント2を見る

値型なのでcopyの変更はoriginalに影響しません

まとめ

  • structは値型:代入で値がコピーされ、独立する
  • classは参照型:代入で同じ実体を共有する
  • 小さく頻繁に作るデータにはstructが向く

次回: 不変な値型readonly structrecord structとボックス化です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。