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

Visual C# 2010 新特性:dynamic 型別深度解析

     編輯:關於C#

dynamic 是什麼?

`dynamic` 是 C# 4.0 引入的靜態型別,但標記為「動態繫結」。編譯器對 `dynamic` 物件假定支援所有操作(方法呼叫、屬性存取、索引子、運算子),不進行靜態型別檢查,全部推遲至執行期由 DLR (Dynamic Language Runtime) 解析。

基本行為


dynamic obj = GetSomeObject(); // 可能是 COM、DOM、Python 物件等
obj.UpdateWordDocument();      // 編譯通過,執行期若無此方法 → RuntimeBinderException

智慧提示與型別推論

  • 大多數 `dynamic` 運算結果仍為 `dynamic`(IntelliSense 顯示 dynamic)。
  • 涉及型別轉換或建構函式參數時,結果回歸靜態型別。
    
    dynamic d = "hello";
    var len = d.Length;        // dynamic (屬性存取)
    var s = (string)d;         // string (轉換)
    var sb = new StringBuilder(d); // StringBuilder (建構函式參數)
    

動態轉換與互通


dynamic d = 10;
int i = d;           // 隱含轉換 dynamic → int
double db = d;       // 隱含轉換 dynamic → double
// 執行期若型別不相容 → InvalidCastException

DLR 架構優勢

  • 統一呼叫模型:Call Site 快取 — 同一呼叫點第二次執行直接命中快取,效能接近靜態呼叫。
  • 語言互通:IronPython、IronRuby、JavaScript (Jurassic) 物件無縫互操作。
  • COM Interop 簡化:`object` 參數/回傳自視為 `dynamic`,免去大量 `ref missing` 與強制轉型。

COM 呼叫前後對比


// C# 3.0 風格
object file = "Test.docx";
object missing = Missing.Value;
doc.SaveAs(ref file, ref missing, ref missing, ...); // 16 個 ref missing

// C# 4.0 + dynamic (搭配 /link 編譯選項嵌入 PIAs)
doc.SaveAs("Test.docx"); // 直接呼叫,參數自動封送

適用場景與避坑

✅ 建議使用❌ 避免使用
Office/COM 自動化核心高效能路徑 (靜態型別快 10-100x)
動態語言互通 (Python/Ruby/JS)領域模型核心 (失去編譯期保護、重構困難)
HTML DOM / JSON 動態存取公開 API 介面 (呼叫端無法獲得型別資訊)
原型快速驗證大型專案核心邏輯

總結

`dynamic` 讓 C# 以靜態語言身分擁抱動態世界,威力巨大但請謹慎使用。核心業務邏輯堅持強型別,邊界整合層善用 `dynamic`,才是平衡之道。

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