作為 C# 之父、Turbo Pascal 與 Delphi 的缔造者,Anders Hejlsberg 在 2003 年 PDC 大會上接受 Bruce Eckel 與 Bill Venners 深度專訪,揭秘 C# 設計過程的核心哲學、對 Checked Exception 的堅持、委派設計考量,以及「組件」作為一等公民的戰略意圖。本文整理精華,呈現一門現代程式語言誕生背後的思維軌跡。
「4 年來,我們一直呆在這個屋子裡。現在,每周一、三、五,我們仍然在這裡會面。」
不同於 Turbo Pascal(單人)與 Delphi(少數核心),C# 採用高度規範化的設計流程:
Hejlsberg 並非獨斷專行,而是在團隊陷入僵局、必須二選一時,基於技術債務最小化原則做最終裁決。他強調:「大多數情況下,正確選擇是顯而易見的。」
| 版本 | 核心成員 |
|---|---|
| C# 1.0 | Scott Wiltamuth、Peter Golde、Peter Sollich、Eric Gunnerson、Anders Hejlsberg |
| C# 2.0 | Peter Hallam、Shon Katzenberger、Todd Proebsting、Anders Hejlsberg |
| 研究支援 | Don Syme、Andrew Kennedy (Microsoft Research) |
「使用一種編程語言會經歷一個感覺微妙變化的過程。只有使用幾個月之後用戶才能真正喜歡上它。」
可用性研究針對具體功能(如 IDE 右鍵選單),但語言整體感受無法在兩小時測試中捕捉。美學品味主觀且難以量化,唯有長期實戰才能驗證。
Java 的 Checked Exception 強制呼叫端捕獲或宣告拋出,看似安全,實則帶來災難:
// v1
void foo() throws A, B, C { ... }
// v2 新增功能需拋出 D
void foo() throws A, B, C, D { ... } // 破壞性變更!
throws Exception 或空 catch {}「在很多情況下,用戶根本就不關心異常。他們不會處理任何異常…… 異常應該集中處理,並在異常來臨處保護好你的代碼。」
try-finally : try-catch ≈ 10:1finally/using,業務異常集中在訊息迴圈處理C# 團隊對此有「廣泛共識」:目前保持沉默,若有公認更好方案再納入。Hejlsberg 引用愛因斯坦:「盡可能簡單行事」,堅持最低綱領主義——無成熟方案不入框架。
「你做了一個很實際上復雜的東西,當你將它包裝為一個簡單的東西時,通常是將它的復雜性隱藏起來……系統可能被你搞得更復雜了。」
真正的簡單:剖開內部依然簡單,而非表面光鮮、內裡錯綜複雜。
// 只要參數相容,同一方法可處理多事件
button.Click += Handler;
menu.Click += Handler; // 無需適配器、無需介面
「組件是一個獨立的軟件部件……通過屬性、方法和事件來實現自我暴露;包含元數據、命名模式等附加特徵,讓開發環境能智能解釋並給出文檔。」
不只是類別,而是可移植、自描述、IDE 可視化的軟體單元。
property 本質是 get_X/set_X 語法糖,但大幅提升可讀性與工具支援「對象本來就是個甜果嘛。我們不過就是在那些虛擬函數表(VTBL)上打轉,你用 C 語言的宏也能實現……」
既然接受物件導向的語法糖,何不接受組件導向的語法糖?
結語:C# 的設計不僅是技術決策的堆疊,更是對「程式設計師生產力」、「語言演進可持續性」與「工具生態共榮」的系統性思考。從拒絕 Checked Exception 到擁抱委派、組件一等公民,每個選擇都指向同一目標:讓正確的事變簡單,讓錯誤的事難以發生。