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

Anders Hejlsberg 專訪:C# 語言設計的哲學與實踐

     編輯:關於C語言

作為 C# 之父、Turbo Pascal 與 Delphi 的缔造者,Anders Hejlsberg 在 2003 年 PDC 大會上接受 Bruce Eckel 與 Bill Venners 深度專訪,揭秘 C# 設計過程的核心哲學、對 Checked Exception 的堅持、委派設計考量,以及「組件」作為一等公民的戰略意圖。本文整理精華,呈現一門現代程式語言誕生背後的思維軌跡。

一、 設計流程:從「獨裁」到「規範化協作」

1. 小團隊、固定節奏、公開透明

「4 年來,我們一直呆在這個屋子裡。現在,每周一、三、五,我們仍然在這裡會面。」

不同於 Turbo Pascal(單人)與 Delphi(少數核心),C# 採用高度規範化的設計流程:

  • 固定會議:每週三次,每次 2 小時
  • 議程靈活:所有問題公開討論、仔細推敲
  • Wiki 留痕:問題、方案、決策全記錄於內部 Wiki

2. 「仁慈的獨裁者」實為「最終拍板者」

Hejlsberg 並非獨斷專行,而是在團隊陷入僵局、必須二選一時,基於技術債務最小化原則做最終裁決。他強調:「大多數情況下,正確選擇是顯而易見的。」

3. 問題發現與追蹤機制

  • 多源回饋:顧問會、新聞組、Bug 報表、不一致性回報
  • 問題表單化:整理成表、逐一重現、登記在冊
  • 定期回顧:擱置數週的問題,集中 30 分鐘攻堅
  • 不遺漏原則:問題不會丟失,遲早會被「再次拜訪」

4. 核心成員名單

版本核心成員
C# 1.0Scott Wiltamuth、Peter Golde、Peter Sollich、Eric Gunnerson、Anders Hejlsberg
C# 2.0Peter Hallam、Shon Katzenberger、Todd Proebsting、Anders Hejlsberg
研究支援Don Syme、Andrew Kennedy (Microsoft Research)

二、 可用性研究 vs. 語言美學:為何美學不可被取代

1. 美學是隱性、長期的體驗

「使用一種編程語言會經歷一個感覺微妙變化的過程。只有使用幾個月之後用戶才能真正喜歡上它。」

可用性研究針對具體功能(如 IDE 右鍵選單),但語言整體感受無法在兩小時測試中捕捉。美學品味主觀且難以量化,唯有長期實戰才能驗證。

2. 實踐策略:語言特性靠社群回饋,IDE 特性靠可用性測試

  • 語言層面:諮詢會、留言板、早期預覽版收集尖銳意見
  • IDE 層面:觀察用戶操作、即時回饋驗證
  • 凍結機制:特性敲定前充分吸納社群建議

三、 Checked Exception:為什麼 C# 說「不」

1. 兩大核心痛點:版本控制與擴展性

Java 的 Checked Exception 強制呼叫端捕獲或宣告拋出,看似安全,實則帶來災難:

版本控制噩夢

// v1
void foo() throws A, B, C { ... }

// v2 新增功能需拋出 D
void foo() throws A, B, C, D { ... }  // 破壞性變更!
  • 所有呼叫端必須重寫以處理 D
  • 介面一旦發布不可變,只能新增介面或包裝轉換異常

擴展性崩潰

  • 大型系統:5 子系統 × 10 異常 = 整合時需處理 50+ 異常
  • 程式設計師繞過機制:throws Exception 或空 catch {}
  • 導致系統品質下降,異常處理淪為形式

2. Hejlsberg 的反駁邏輯

「在很多情況下,用戶根本就不關心異常。他們不會處理任何異常…… 異常應該集中處理,並在異常來臨處保護好你的代碼。」

  • 現實中 try-finally : try-catch ≈ 10:1
  • 資源清理用 finally/using,業務異常集中在訊息迴圈處理
  • API 設計者應告知如何處理,而非強迫呼叫端猜測

3. 團隊共識與未來態度

C# 團隊對此有「廣泛共識」:目前保持沉默,若有公認更好方案再納入。Hejlsberg 引用愛因斯坦:「盡可能簡單行事」,堅持最低綱領主義——無成熟方案不入框架。

四、 委派 vs. 介面:Simplicity vs. Simplexity

1. 什麼是 Simplexity?

「你做了一個很實際上復雜的東西,當你將它包裝為一個簡單的東西時,通常是將它的復雜性隱藏起來……系統可能被你搞得更復雜了。」

真正的簡單:剖開內部依然簡單,而非表面光鮮、內裡錯綜複雜。

2. Java 事件模型的「家務管理」地獄

  • 介面對應事件,方法數不定(1~4+),無明確規範
  • 單一事件單一介面?所有事件共用介面?兩難選擇
  • 實作多介面 → 需適配器 → 內部類勉強緩解
  • 事件接收者必須顯式實作監聽介面

3. 委派的優雅:唯一依賴「簽名相容」

// 只要參數相容,同一方法可處理多事件
button.Click += Handler;
menu.Click  += Handler;  // 無需適配器、無需介面
  • 編譯期型別檢查,效率優於介面派發
  • 實例化即解決虛擬函數表查找,調用為間接指令
  • Multicast 為正交特性,核心系統僅用 Singlecast,零額外開銷

五、 組件導向:賦予 Property/Method/Event 一等公民地位

1. 什麼是組件?

「組件是一個獨立的軟件部件……通過屬性、方法和事件來實現自我暴露;包含元數據、命名模式等附加特徵,讓開發環境能智能解釋並給出文檔。」

不只是類別,而是可移植、自描述、IDE 可視化的軟體單元。

2. 語言層面支援的必要性

  • C++/Java 可寫組件,但語言不支援 → 痛苦得多
  • property 本質是 get_X/set_X 語法糖,但大幅提升可讀性與工具支援
  • PME(屬性/方法/事件)模式已成主流,語言理應給予「至高待遇」

3. 歷史視角:物件本身就是語法糖

「對象本來就是個甜果嘛。我們不過就是在那些虛擬函數表(VTBL)上打轉,你用 C 語言的宏也能實現……」

既然接受物件導向的語法糖,何不接受組件導向的語法糖?


Anders Hejlsberg 簡歷

  • 80 年代初開發 Pascal 編譯器 (MS-DOS/CP/M)
  • Borland 收購 → Turbo Pascal → Delphi 主架構師
  • 1996 年加入 Microsoft
  • 主導設計 C#、TypeScript、.NET 執行環境核心

結語:C# 的設計不僅是技術決策的堆疊,更是對「程式設計師生產力」、「語言演進可持續性」與「工具生態共榮」的系統性思考。從拒絕 Checked Exception 到擁抱委派、組件一等公民,每個選擇都指向同一目標:讓正確的事變簡單,讓錯誤的事難以發生。

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