在泛型類別中,若欄位型別為型別參數 T,無法直接指派 null(因 T 可能為值型別)。default(T) 關鍵字可在編譯期依實際型別引數產生正確的預設值:數值型別為 0、參考型別為 null、結構體為所有欄位遞迴預設值。
public class DefaultValueExample
{
private T _data = default(T); // 欄位初始化
public bool IsDefaultData()
{
T temp = default(T); // 區域變數預設值
return EqualityComparer.Default.Equals(temp, _data);
}
public void SetData(T val) => _data = val;
}
// 使用
var ex = new DefaultValueExample();
Console.WriteLine(ex.IsDefaultData()); // True (_data = 0)
ex.SetData(100);
Console.WriteLine(ex.IsDefaultData()); // False
default(T) 在編譯期解析為對應 IL:initobj(值型別)或 ldnull(參考型別)。EqualityComparer.Default.Equals 比較,避免 == 運算子未定義或 boxing。default 字面常數(型別推論):T temp = default;。default(T) 不會呼叫建構子(結構體無無參建構子),單純將記憶體歸零。_items = new T[capacity]; 隱含 default(T))。DefaultValueExample)。T temp = default;。IComparer、IEqualityComparer 時的預設比較邏輯。本系列 8 篇涵蓋:泛型決策、型別理解、List/Queue/Stack/Hashtable 對應泛型版本、約束、ReadOnlyCollection、Dictionary 替換 Hashtable、foreach KeyValuePair、default(T)。掌握這些,即可在 .NET 2.0+ 專案中自信地設計高效能、型別安全的泛型元件。