這篇文章記錄了我對 C# 強類型機制的學習體會,並非官方標準文檔。如有謬誤,歡迎各位大神指正。
先看兩段簡單的代碼:
object o1 = new object();
string s1 = o1.ToString(); // s1 將會是 "System.Object"
object o2 = "hello";
string s2 = o2.ToString(); // s2 將會是 "hello"
這在 C++ 中是完全不同的行為。在 C++ 裡,o2.ToString() 會調用 object 的 ToString() 方法,而不是 string 的重寫版本。因為 o2 只是靜態綁定到 object 類型,編譯期就決定了調用哪個方法。
C# 採用基於運行時的強類型。當程序執行 o2.ToString() 時,系統會:
o2 真正指向的對象(這裡是一個 string 實例)ToString() 方法string 類型已重寫 ToString(),直接調用 string 版本這就是「運行時類型識別」的核心:變數的聲明類型只是編譯期約束,實際調用取決於對象的真實類型。
| 特性 | C++ | C# |
|---|---|---|
| 編譯目標 | 機器碼 | IL (中間語言) |
| 方法調用指令 | jmp [memory_address] 直接跳轉 | callvirt ClassName.MethodName 需經過 Runtime 解析 |
| 地址確定時間 | 編譯/鏈接期 | 運行時由 Runtime 根據類型和實例地址計算 |
雖然最終都要跳轉到某個地址執行,但 C# 的這個地址是在運行時動態確定的,這正是多態和強類型的基礎。
C# 的強類型不僅體現在編譯期的類型檢查,更體現在運行時對象擁有完整的類型信息,使得虛方法調用、反射、動態綁定等特性成為可能。這與 C++ 的靜態綁定模型有本質區別,也是托管運行時環境的核心優勢之一。