導入
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 struct・record structとボックス化です。