DateTime 是結構 (struct),定義於 System 命名空間,繼承 ValueType。
| 維度 | 結構 | 類 |
|---|---|---|
| 類型分類 | 值類型 | 引用類型 |
| 記憶體分配 | 棧 (內嵌於父對象/陣列) | 堆 (需 GC 管理) |
| 賦值語義 | 複製整個實例 | 複製引用 (指向同一對象) |
| 預設值 | 所有欄位為 0/null/false | null |
| 可為 null | 需 Nullable<T> (如 DateTime?) | 天然可為 null |
| 繼承 | 不可繼承 (隱式 sealed) | 支援繼承 |
| 介面實作 | ✅ | ✅ |
| 方法/屬性/事件 | ✅ 全支援 | ✅ 全支援 |
| 建構函式 | 僅支援帶參數 | 支援無參/帶參 |
| 解構函式 | ❌ | ✅ (Finalizer) |
| 成員預設存取 | private | private |
| 適用場景 | 小型、不可變、高頻創建、數值語義 | 複雜行為、共享狀態、多態、大型對象 |
int、doubleDateTime.Now 每秒可調用百萬次無壓力DateTime[] 緊湊存儲,CPU 緩存友好| 陷阱 | 錯誤代碼 | 正確代碼 |
|---|---|---|
| 盒裝/拆箱 | object o = DateTime.Now; | 避免裝箱,用泛型/介面 |
| 大結構傳參 | void Foo(BigStruct s) | void Foo(ref BigStruct s) 或改類 |
| 可變結構 | struct S { public int X; } | 設計為 不可變 (readonly fields) |
| null 比較 | if (dt == null) | if (dt == default) 或用 DateTime? |
需要繼承/多態? → 類
需頻繁創建/銷毀(>1000/s)? → 結構 (小於 16 bytes)
需語義上為「值」? → 結構
需可為 null 且無額外開銷? → 類
需實現 IDisposable? → 類
預設選:類 (參考語義直觀,誤用風險低)
DateTime 作為結構的典範,展示了值類型在高效能、數值語義場景下的優勢。