脫離 .NET 平台談 C# 毫無意義,C# 之「銳利」正源於其強大後端平台。單純著重語法層面無法體驗 C# 銳利之處,C# 程式許多奧妙必須仰賴 .NET 平台深度掌握運用。簡單說,.NET 平台建立在開放網際網路協定與標準之上,採用新工具與服務滿足計算與通訊需求的革命性 XML Web 智慧運算服務平台,讓應用程式在網際網路便捷互通,不受作業系統與程式語言限制。
.NET 平台主要包含兩大核心:通用語言執行平台 (CLR) 與 .NET 框架類別庫,為平台實現提供底層技術支撐。CLR 位於作業系統最底層,為 .NET 平台執行引擎。框架類別庫提供可被任何程式語言使用的類別庫,讓程式設計師更容易建立網路應用與服務。之上為多種應用程式模板,為開發網路應用與服務提供高階元件與服務。
CLR 是整個 .NET 框架賴以建構的基礎,為 .NET 應用程式提供受控代碼執行環境。實際上是駐留記憶體的代理代碼,負責應用程式整個執行期間的代碼管理:記憶體管理、執行緒管理、安全性管理、遠端管理、即時編譯 (JIT)、代碼強制安全型別檢查等——可稱 .NET 框架生命線。
CLR 代理了部分傳統作業系統管理功能。CLR 下代碼稱「受控代碼」,否則為「非受控代碼」。CLR 亦可視為技術規範:任何語言編寫,只要能編譯成 Microsoft 中介語言 (MSIL),即可在其支援下執行,實現語言獨立性。目前支援 CLR 語言達二十餘種。MSIL 為 .NET 平台編譯器輸出 PE 檔案語言,最完整語言集,類似 PC 組合語言。JIT 編譯器在執行時將 MSIL 編譯成本機二進制代碼,提供多語言底層技術支援。另提供經濟型 JIT 與安裝時編譯技術。
如 Windows 直接支援視窗、控制項、圖形、選單為訊息導向程式設計添加底層結構,CLR 直接支援元件(含屬性與事件)、物件、繼承、多型、介面。屬性與事件直接支援讓元件程式設計更簡單,無需特殊介面與配接器設計模式。元件執行時,CLR 管理記憶體配置、啟動/中止執行緒與進程、強化安全性,並調整相關元件附屬配置。序列化支援多種格式操作磁碟元件,含基於 XML 標準的 SOAP。CLR 提供強力協調錯誤處理方式。每個模組具完整內建中繼資料,讓動態建立與方法呼叫更容易、更安全。反映允許靈活建立與執行代碼。可控制應用程式使用元件版本,提高可靠性。元件代碼為與處理器無關、易驗證的中介語言 (IL),非特定機器語言,意謂元件不僅可跨多種電腦執行,且確保不會覆蓋未使用記憶體、不會導致系統崩潰。CLR 依受控元件來源(網際網路、企業區網、本機)判定適當信任度,限定執行讀取檔案、修改登錄等敏感操作權限。通用型別系統 (CTS) 嚴格型別安全檢查避免元件間型別不匹配。CLR 程式設計完全圍繞元件進行。
CLR 通常寄宿於高效能伺服器應用程式(IIS、SQL Server),讓我們充分利用其安全、高效優勢部署商業邏輯。
CLR 對程式設計師影響最大的是記憶體管理功能,提供高效能垃圾收集環境。垃圾收集器自動追蹤應用程式操作物件,程式設計師不再需處理複雜記憶體管理。雖自動化記憶體管理無法媲美特定程式量身訂製的手工管理,但現代軟體業動輒成千上萬行代碼,大量商業邏輯凸顯的是可管理性、可維護性的工程代碼。.NET/C# 非為「作坊高手」準備,C 語言才是他們最愛。
在受控環境下,CLR 負責物件記憶體配置、管理物件參考、釋放不再使用記憶體(自動垃圾收集)。從根本解決長期困擾軟體的記憶體洩漏與無效記憶體參考問題,大幅減輕開發負擔,提高程式健壯性。受控環境根本找不到記憶體操作或釋放語言指令。.NET 應用程式可使用受控資料與非受控資料,但 CLR 無法判斷兩者。
new 建立新物件時,在受控堆積配置記憶體。垃圾收集器不意味著程式設計師一勞永逸。操作包裝檔案、網路連線、Windows 控制代碼、點陣圖等底層作業系統資源的物件時,仍需明確釋放非受控資源。詳細闡述見「第五講:建構函式與解構函式」。