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

C# 泛型 new() 約束深度解析:編譯期檢查與 Activator.CreateInstance 運行時機制

     編輯:關於C語言

常見誤解

以為 where T : new() 讓 new T() 與非泛型 new Object() 完全等價。實際上:

編譯期:靜態檢查

Tester<SomeType> t = new Tester<SomeType>();

編譯器於此處檢查 SomeType 是否具備公用無參數建構函式。若無,直接報錯 CS0310。

運行期:透過反射建立實例

public class Tester<T> where T : new()
{
    public Tester()
    {
        // 等價於:
        t = System.Activator.CreateInstance<T>();
    }
    private T t;
}

new T() 在 IL 層級編譯為 Activator.CreateInstance<T>() 呼叫,非直接 newobj 指令。因此:

  • 效能較直接 new 略低(反射開銷)。
  • 若 T 為實質型別,仍正常運作(CLR 特殊處理)。

設計建議

  • 高效能路徑避免在熱路徑使用 new T(),改用委派工廠 Func<T> 注入。
  • 僅作為編譯期約束確保型別可實例化,運行期機制明確理解。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved