C# 的「Sharp」銳利之處,根植於其背後強大的 Microsoft .NET 平台。僅停留在語法層面無法體驗 C# 的精髓,許多看似詭秘的程序行為,必須依賴 .NET 平台才能深度掌握與運用。簡單來說,.NET 平台建立在開放的互聯網協議與標準之上,採用新工具與服務,滿足計算與通信需求的革命性 XML Web 智能計算服務平台。它讓應用程序在互聯網上便捷通信,無需關心底層作業系統與編程語言。
從技術層面看,.NET 平台主要包含兩大內核,為平台實現提供底層技術支撐:
在此基礎上,還有眾多應用程序模板,為網絡應用與服務開發提供高級組件與服務。
CLR 是整個 .NET 框架的基石,提供托管代碼執行環境。它實際上駐留在內存中的代理代碼,負責應用程序整個生命週期的代碼管理,典型職責包括:
這些功能可稱得上是 .NET 框架的生命線。CLR 實際上代理了部分傳統作業系統的管理功能。
運行在 CLR 下的代碼稱為托管代碼,否則為非托管代碼。CLR 亦可視為一個技術規範:無論使用何種語言編寫,只要能編譯為微軟中間語言 (MSIL),即可在其支持下運行,實現語言無關性。目前支持 CLR 的編程語言多達二三十種。MSIL 是 .NET 平台下編譯器輸出 PE 文件的語言,類似於 PC 機上的匯編語言。即時編譯器 (JIT) 在運行時將 MSIL 編譯為本地二進制代碼,提供多語言底層支撐。此外,根據需要還提供經濟型 JIT 和安裝時編譯技術。
CLR 設計目的正是為基於組件的編程提供一等支持。正如 Windows 為消息編程添加底層結構,CLR 直接支持:
對屬性與事件的直接支持,使基於組件的編程更簡單,無需特殊接口與適配器模式。運行時 CLR 負責內存分配、線程/進程啟動中止、安全強化、附屬組件配置調整。序列化支持允許以多種格式(含基於 XML 的 SOAP)操作磁盤上的組件。CLR 提供強大、協調的錯誤處理機制。每個模塊擁有完整元數據,使動態創建與方法調用更容易、更安全。映射甚至允許靈活創建與執行代碼。版本控制使應用程序更可靠。組件代碼為處理器無關、易驗證的中間語言,確保不覆蓋未使用內存、不導致系統崩潰。CLR 根據組件來源(互聯網、企業內網、本地)判定信任度,限定敏感操作權限。通用類型系統 (CTS) 對代碼類型進行嚴格安全檢查,避免類型不匹配。CLR 下的編程完全圍繞組件展開。
CLR 通常寄宿於高性能服務器應用程序中,如 IIS、SQL Server,使我們能充分利用其安全、高效優勢部署商業邏輯。
CLR 內存管理功能對程序員影響最大,提供高性能垃圾回收環境。GC 自動追蹤應用程序操作的對象,程序員無需處理複雜內存管理。雖然自動內存管理無法媲美為特定程序量身定制的手工管理,但現代軟件工程早已非百行代碼作坊,可管理性、可維護性才是核心。.NET/C# 面向工程級代碼,而非追求極致底層控制的場合。
在托管環境下,CLR 負責對象內存佈局、引用管理、釋放未使用內存(自動 GC),從根本上解決內存洩漏與無效引用問題,大幅減輕開發負擔,提高程序健壯性。托管環境中找不到任何內存操作或釋放的語言指令。值得注意的是,.NET 應用程序可使用托管數據與非托管數據,但 CLR 無法判斷兩者邊界。
new 創建對象時,GC 在托管堆分配內存GC 並不意味著一勞永逸。操作包裝文件、網絡連接、Windows 句柄、位圖等底層資源的對象時,仍需顯式釋放非托管資源,詳見「構造函數與析構函數」章節。
FCL 是廣泛的、面向對象的可重用類集合,為應用程序提供各種高級組件與服務,將程序員從繁重編程細節中解放,專注商業邏輯。無論控制台程序、Windows 圖形界面,還是 ASP.NET、XML Web Services,均提供開發支撐。主要組件與服務概覽:
.NET 平台浩瀚精深,本文重點剖析了對 C# 開發至關重要的 CLR、內存管理、FCL 三大基石。理解這些基礎構造,是編寫高效、健壯、可維護 C# 應用的關鍵。