教程 C#銳利體驗
第三講 Microsoft.NET平台基礎構造
南京郵電學院 李建忠(cornyfield@263.net)
拋開Microsoft.NET平台去談C#是沒有意義的,C#之“Sharp”也正在其後端強大的平台。僅僅拘泥於文法層面是體驗不了C#的銳利之處的,C#程式很多詭秘之處必須依靠Microsoft.NET平台才能深度的掌握和運用。簡單的講,Microsoft.NET平台是一個建立在開放互連網絡協議和標準之上,採用新的工具和服務來滿足人們的計算和通訊需求的革命性的新型XML Web智能計算服務平台。它允許應用程式在網際網路上方便快捷地互相通訊,而不必關心使用何種作業系統和程式設計語言。
從技術層面具體來說,Microsoft.NET平台主要包括兩個核心,即通用語言運行時(Common Language Runtime,簡稱CLR)和Microsoft.NET架構類庫,它們為Microsoft.NET平台的實現提供了底層支援人員。通用語言運行時是建立在作業系統最底層的服務,為Microsoft.NET平台的執行引擎。Microsoft.NET架構套件括一套可被用於任何程式設計語言的類庫,其目的是使得程式員更容易地建立基於網路的應用和服務。在此之上是許多應用程式模板,這些模板為開發網路應用和服務提供進階的組件和服務。Microsoft.NET平台之浩瀚絕非這裡的幾千字能夠廓清,我們下面將著重體驗那些對我們用C#開發應用程式至關重要的平台基礎構造。
通用語言運行時(CLR)
通用語言運行時是整個Microsoft.NET架構賴以建構的基礎,它為Microsoft.NET應用程式提供了一個託管的代碼執行環境。它實際上是駐留在記憶體裡的一段代理代碼,負責應用程式在整個執行期間的代碼管理工作,比較典型的有:記憶體管理,線程管理,安全管理,遠端管理,即時編譯,代碼強制安全類型檢查等。這些都可稱得上Microsoft.NET架構的生命線。
實際上我們可以看出來,CLR代理了一部分傳統作業系統的管理功能。在CLR下的代碼稱之為Managed 程式碼,否則稱為Unmanaged 程式碼。我們也可將CLR看作一個技術規範,無論程式使用什麼語言編寫,只要能編譯成微軟中繼語言 (MSIL),就可以在它的支援下運行,這使得應用程式得以獨立於語言。目前支援CLR的程式設計語言多達二三十種。微軟中繼語言是我們在Microsoft.NET平台下編譯器輸出的PE檔案的語言。它是Microsoft.NET平台最完整的語言集,非常類似於PC機上的組合語言。即時編譯器在運行時將中繼語言編譯成本地二進位代碼。它為Microsoft.NET平台提供了多語言的底層支援人員。另外根據需要,Microsoft.NET即時編譯器提供了特殊情況下的經濟型即時編譯和安裝時編譯技術。
CLR的設計目的便是直接在應用程式運行環境中為基於組件的編程提供第一等的支援。正如在Windows中添加了對視窗、控制項、圖形和菜單的直接支援,為基於訊息的編程添加了底層結構,為支援裝置無關性添加了抽象內容一樣,CLR直接支援組件(包括屬性和事件)、對象、繼承性、多態性和介面。對屬性和事件的直接支援使得基於組件的編程變得更簡單,而不需要特殊的介面和適配設計模式。在組件運行時,CLR負責管理記憶體配置、啟動和中止線程和進程、強化安全係數,同時還調整任何該組件涉及到的其他組件的附屬配置。序列化支援允許以多種格式操作儲存在磁碟上的組件,包括基於業界標準XML的SOAP。CLR提供了處理錯誤條件的有力、協調的方式。每個模組都具有內建的完整的中繼資料,這意味著諸如動態建立和方法調用之類的功能更容易,也更安全。映射甚至允許我們靈活地建立和執行代碼。我們可以控制應用程式使用的組件的版本,這使應用程式更加可靠。組件代碼是與處理器無關的和易於驗證的中繼語言 ( IL),而不是某一種特定的機器語言,這意味著組件不但可以在多種電腦上運行,而且可以確保組件不會覆蓋它們不使用的記憶體,也不會潛在地導致系統崩潰。CLR根據託管組件的來源(例如來自網際網路,企業區域網路,本地機)等因素對他們判定以適當的信任度,這樣CLR會根據他們的信任度來限定他們執行如讀取檔案,修改註冊表等某些敏感操作的許可權。藉助一般型別系統(Common Type System,簡稱CTS)對代碼類型進行嚴格的安全檢查避免了不同組件之間可能存在的類型不符的問題。CLR下的編程全部是圍繞組件進行的。
值得指出的是CLR通常寄宿在其他高效能的伺服器應用程式中,比如:網際網路資訊服務器(IIS),Microsoft SQL Server。這使得我們可以充分利用通用語言運行時諸多的安全,高效的優點來部署自己的商業邏輯。
記憶體管理
CLR對程式員影響最大的就是它的記憶體管理功能,以至於我們很有必要單獨把它列出來闡述。它為應用程式提供了高效能的垃圾收集環境。垃圾收集器自動追蹤應用程式操作的對象,程式員再也用不著和複雜的記憶體管理打交道。這在某些喜歡張口閉口底層編程的所謂的高手來說,自動記憶體管理從來都是他們嘲笑的對象。的確,為通用軟體環境設計的自動化記憶體管理器永遠都抵不上自己為特定程式量身訂製的手工製作。但現代軟體業早已不再是幾百行代碼的作坊作業,動輒成千上萬行的代碼,大量的商業邏輯凸現的已不再是演算法的靈巧,而是可管理性,可維護性的工程代碼。.NET/C#不是為那樣的作坊高手準備的,C語言才是他們的尤物。在Microsoft.NET託管環境下,CLR負責處理對象的記憶體布局,管理對象的引用,釋放系統不再使用的記憶體(自動垃圾收集)。這從根本上解決了長期以來困擾軟體的記憶體流失和無效記憶體引用問題,大大減輕了程式員的開發負擔,提高了程式的健壯性。實際上我們在託管環境下根本找不到關於記憶體操作或釋放的語言指令。值得指出的是Microsoft.NET應用程式可以使用管理的資料,也可以使用非管理的資料,但CLR並不能判斷管理的資料與非管理的資料。
垃圾收集器負責管理.NET應用程式記憶體的分配和釋放。當用new操作符建立新的對象時,垃圾收集器在託管堆(Managed Heap)中為對象分配記憶體資源。只要託管堆內的記憶體空間可用,垃圾收集器就為每一個新建立的對象分配記憶體。當應用程式不再持有某個對象的引用,垃圾收集器將會探測到並釋放該對象。值得注意的是垃圾收集器並不是在對象引用無效時就立即開始釋放工作,而是根據一定演算法來決定什麼時候進行收集和對什麼對象進行收集。任何一個機器的記憶體資源總是有限的,當託管堆內的記憶體空間不夠用時,垃圾收集器啟動收集線程來釋放系統記憶體。垃圾收集器根據對象的存活時間,對象曆經的收集次數等來決定對哪些對象的記憶體進行釋放。宏觀的看,我們並不知道垃圾收集的確切行為,但Microsoft.NET類庫為我們提供了控制垃圾收集行為的部分功能,在某些特殊情況下,我們有必要進行一些受限的操作。
垃圾收集器並不意味著程式員從此可以一勞永逸,如果正在操作一個封裝了如檔案,網路連接,Windows控制代碼,位元影像等底層作業系統資源的對象,我們還是需要明確地釋放這些非託管資源的。這在“第五講 構造器與析構器”裡有詳細的闡述。
Microsoft.NET架構類庫
Microsoft.NET架構類庫是一組廣泛的,物件導向的可重用類的集合,為應用程式提供各種進階的組件和服務。它將程式員從繁重的編程細節中解放出來專註於程式的商業邏輯,為應用程式提供各種開發支援--不管是傳統的命令列程式還是Windows圖形介面程式,擬或是面向下一代網際網路分散式運算平台的ASP.NET或XML Web服務。下面是對這些組件和服務的一個概括。
- 系統架構服務
服務架構套件括一套開發人員希望在標準語言庫中存在的基底類別庫,例如:集合、輸入/輸出,字串及資料類。另外,基底類別庫提供訪問作業系統服務如圖畫、網路、線程、全球化和加密的類。服務架構也包括資料訪問類庫,及開發工具,如調試和剖析服務,能夠使用的類。
- ADO.NET組件
ADO.NET為基於網路的可擴充的應用程式和服務提供資料訪問服務。ADO.NET不僅支援傳統的基於串連指標風格的資料訪問,同時也為更適合於把資料返回到用戶端應用程式的不需連線的資料範本提供高效能的訪問支援。
- XML資料群組件
所有的資料都可被看作XML,開發人員可以通過XML為任何資料使用轉換,傳輸和確認服務。系統架構對XML資料提供第一等的操作支援。系統也支援ADO.NET資料與XML資料之間的通用轉換。
- Windows表單組件
Windows表單組件為開發人員提供了強大的Windows應用程式模型和豐富的Windows使用者介面,包括傳統的ActiveX控制項和Windows XP的新介面,如透明的、分層的、浮動視窗。對設計時的強大支援也是Windows表單組件令人興奮的地方。
- ASP.NET應用服務
ASP.NET的核心是高效能的用於處理基於低級結構的HTTP請求的運行語言。編譯運行方式大大提高了它的效能。ASP.NET使用基於構件的Microsoft .NET架構配製模板,因此它獲得了如XCOPY配製、構件並行配製、基於XML配製等優點。它支援應用程式的即時更新,提供高速緩衝服務改善效能。
- ASP.NET Web表單
ASP.NET Web表單把基於VB的表單的高生產性的優點帶到了網路應用程式的開發中來。ASP.NET Web表單支援傳統的將HTML內容與角本代碼混合的ASP文法,但是它提出了一種將應用程式代碼和使用者介面內容分離的更加結構化的方法。ASP.NET提供了一套映射傳統的HTML使用者介面組件(包括列表框,文字框和按鈕)的ASP.NET Web表單控制項和一套更加複雜強大的網路應用控制項(如日曆和廣告轉板)。
- XML Web服務
ASP.NET應用服務體系架構為用ASP.NET建立XML Web服務提供了一個進階的可程式化模板。雖然建立XML Web服務並不限定使用特定的服務平台,但是它提供許多的優點將簡化開發過程。使用這個編程模型,開發人員甚至不需要理解HTTP、SOAP或其它任何網路服務規範。 ASP.NET XML Web服務為在Internet上繫結應用程式提供了一個利用現存體系架構和應用程式的簡單的、靈活的、基於產業標準的模型。