首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 泛型秘訣(8/完):default(T) 初始化泛型變數為預設值

     編輯:關於C#

在泛型類別中,若欄位型別為型別參數 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。
  • C# 7.1+ 支援 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+ 專案中自信地設計高效能、型別安全的泛型元件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved