// 定義
public struct Point3D {
public int X, Y, Z; // 欄位
public readonly double Dist; // 唯讀欄位 (C# 7.2+)
public Point3D(int x, int y, int z) { X=x; Y=y; Z=z; Dist = Math.Sqrt(x*x+y*y+z*z); }
public void Translate(int dx, int dy, int dz) { X+=dx; Y+=dy; Z+=dz; } // 可變方法
public override string ToString() => $"({X},{Y},{Z})";
}
// 使用
var p1 = new Point3D(1,2,3); // 棧分配,無 new 也可但欄位需全部初始化
var p2 = p1; // **值複製**,p2 獨立於 p1
p2.Translate(10,0,0);
Console.WriteLine(p1); // (1,2,3) 未受影響
Console.WriteLine(p2); // (11,2,3)
int i = 42;
object o = i; // 裝箱:堆分配 object,複製值
int j = (int)o; // 拆箱:類型檢查 + 複製值回棧
// 隱式裝箱陷阱
var list = new ArrayList(); // 非泛型集合
list.Add(42); // 每次 Add 都裝箱!
// 改用 List 避免裝箱
效能影響
分配堆記憶體 + 複製值 + GC 壓力。
熱路徑**嚴禁**裝箱:用泛型、`Span`、`ref struct` 避免。
四、可空值類型
int? x = null; // Nullable
int? y = x + 10; // C# 7.3+ 支援 lifted 運算符:null + 10 = null
int z = x ?? -1; // 空合併運算符
bool has = x.HasValue; // 檢查
int val = x.Value; // 取值 (若 null 拋異常)
int val2 = x.GetValueOrDefault(); // 安全取值
五、記憶體佈局可視化
// 類實例在堆
class Node { public int Id; public Node Next; }
Node n = new Node { Id = 1 };
// 堆: [SyncBlockIndex][TypeHandle][Id=1][Next=ref] → 另一 Node 對象
// 結構在棧/內嵌
struct Point { public int X; public int Y; }
Point p = new Point { X=1, Y=2 };
// 棧/父對象內: [X=1][Y=2] (連續 8 bytes,無對象頭)
// 陣列在堆
int[] arr = { 1, 2, 3 };
// 堆: [SyncBlockIndex][TypeHandle][Length=3][1][2][3] (元素內嵌)