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

C# default 關鍵字完全指南:泛型變數預設值初始化的標準做法

     編輯:關於C語言

前言

泛型程式設計中,如何為型別參數 T 的變數指定「預設值」?null 僅適用參考型別,實值型別(int、struct)不可為 null。C# 提供 default(T) 運算子,在編譯期依據 T 實際型別自動產生正確預設值,是泛型初始化的標準解法。

核心範例:DefaultValueExample<T>

public class DefaultValueExample<T>
{
    T _data = default(T); // 欄位初始化

    public bool IsDefaultData()
    {
        T temp = default(T); // 區域變數初始化
        return temp.Equals(_data);
    }

    public void SetData(T val) => _data = val;
}

使用測試

var dv = new DefaultValueExample<int>();
Console.WriteLine(dv.IsDefaultData()); // True (_data = 0)

dv.SetData(100);
Console.WriteLine(dv.IsDefaultData()); // False

輸出:

Initial data: True
Set data: False

default(T) 語意完整對照表

T 的分類具體型別範例default(T) 結果
數值型別int, long, double, decimal, byte...0 (或 0.0)
布林型別boolfalse
字元型別char'\0' (U+0000)
列舉型別enum E { A, B }0 (轉換為底層整數)
參考型別class, interface, delegate, array, stringnull
可空值型別int?, Nullable<DateTime>null (HasValue=false)
結構體DateTime, Guid, 自訂 struct所有欄位遞迴 default(數值=0、參考=null)

為何不能用 null?

// 錯誤示範
T _data = null; // CS0403: 無法將 null 轉換為型別參數 T,因為它可能是不可為 null 的實值型別

編譯器不知道 T 會被具現化為何種型別,為了型別安全,禁止隱含 null 指派。

可空型別不是萬靈丹

雖然 Nullable<T> (或 T?) 可儲存 null,但:

  1. 僅適用實值型別 T,參考型別本身已可為 null
  2. 引入額外 HasValue 檢查複雜度
  3. 改變了 API 語意(原本非可空變成可空)

default(T) 統一處理所有分類,零成本、零認知負擔。

進階:C# 7.1+ default 字面常數

// 型別可推斷時,可省略型別參數
T _data = default; // 等同 default(T)
var temp = default; // 需有明確型別推斷上下文

適用於欄位初始化、區域變數宣告、方法預設參數等場合。

實戰模式:泛型快取預設值

public class Cache<TKey, TValue>
{
    private TValue _defaultValue = default; // 編譯期確定

    public TValue GetOrDefault(TKey key)
    {
        if (_store.TryGetValue(key, out var val)) return val;
        return _defaultValue; // 直接回傳,無需判斷 TValue 分類
    }
}

總結

default(T) 是 C# 泛型初始化的基石:

  1. 通用性:涵蓋所有型別分類(實值、參考、可空、結構體)
  2. 安全性:編譯期保證型別正確,杜絕 null 指派風險
  3. 效能:零執行期開銷,JIT 直接內嵌常數
  4. 可讀性:語意明確,default 字面常數更簡潔

編寫泛型程式碼時,永遠使用 default(T) 或 default 初始化型別參數變數,是專業 C# 開發者的標準習慣。

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