public class Class1
{
private MyData _data = new MyData(); // 建構子即建立
public MyData Data => _data;
}
問題:若 MyData 佔用大量記憶體且使用率低,**每個 Class1 實例皆強制付出成本**。
public class Class1
{
private MyData _data; // 初始為 null
public MyData Data
{
get
{
if (_data == null) _data = new MyData(); // 首次存取才建立
return _data;
}
}
}
| 策略 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Pre-Allocate (預先配置) | 存取零判斷、速度最快 | 必付記憶體成本 | 高頻必用屬性 (如集合容器內部陣列) |
| Lazy-Allocate (延遲配置) | 按需付費、節省記憶體 | 首次存取多一次 null 檢查 | 低頻/可選屬性 (如 ASP.NET Style、大型子物件) |
BCL 大量採用 Lazy-Allocate:Control.Controls、Control.ContextMenu、WebControl.Style 等皆為首次存取才實例化。此模式體現「以時間換空間」的經典工程權衡。