C#基础教程(一).NET框架
一、.NET
是由微軟開發,一個致力于敏捷軟件開發、快速應用開發、平臺無關性和網絡透明化的軟件開發平臺。.NET框架是以一種采用系統虛擬機運行的編程平臺,以通用語言運行庫(Common Language Runtime)為基礎,支持多種語言(C#、VB.NET、C++、Python等)的開發。比如Python,可以借助微軟提供的開源工具,即?IronPython,可以在C#中直接調用Python類庫函數,Python會編譯成CIL(又稱MSIL,CL,以下就稱CIL)
二、CLR
CLR即公共語言運行時(Common Language Runtime,簡稱CRL),就是微軟為.net產品構建的運行環境,與java的JVM類似,通俗的講就是.net虛擬機。CLR上實際運行的并不是我們通常所用的編程語言(例如C#、VB等),而是一種字節碼形態的"中間語言"。這意味著只要能將代碼編譯成這種特定的"中間語言"(MSIL),任何語言的產品都能運行在CLR上。CLR通常被運行在Windows系統上,但是也有一些非Windows的版本。這意味著.Net也很容易實現"跨平臺"。CLR是.net系列產品運行的基礎。
三、托管代碼/非托管代碼與托管資源/非托管資源
定義:Common Intermediate Language,公共中間語言。
托管代碼
托管代碼是在公共語言運行庫中運行的代碼,托管代碼的執行由公共語言運行庫來直接控制,而不是操作系統來直接控制。具體而言,由公共語言運行庫中的代碼管理器來控制和執行托管代碼,而公共語言運行庫的其他部分會提供托管代碼執行時所需要的各種服務,如垃圾回收、類型檢查、安全支持等。托管代碼不是源碼,是CIL,遵守公共語言規則的語言都可以編譯成CIL,比如C++,Phython,前提在微軟特定工程和特定IDE,編譯方法肯定與源語言沒跨平臺之前編譯不同。
非托管代碼
非托管代碼是在托管代碼的概念出現后相對于托管代碼而言的,其實際上是計算機操縱系統可識別的機器碼。非托管代碼(機器碼)的執行由操作系統來控制,其在執行時也需要各種服務,如垃圾回收、類型檢查、安全支持等。由于沒有像公共語言運行庫這樣的東西會自動給你提供服務,所以你需要自己提供這些服務,也就說你要寫額外的代碼來實現垃圾回收等功能。非托管代碼比如在C#中直接調用c++dl,那么c++那部分直接編譯成機器語言直接交給計算機系統去運作。
托管資源
與托管代碼密切相關的是托管資源。托管資源是由公共語言運行的垃圾回收器進行分配和釋放的數據。默認情況下,C#、VisualBasic和JScript.NET數據是托管資源。不過,通過使用特殊的關鍵字,C#數據可以被標記為非托管資源。VisualC++數據在默認情況下是非托管數據,即使在使用/CLR開關時也不是托管的。
關于托管資源,就不用說了,像簡單的int,string,float,DateTime等等,.net中超過80%的資源都是托管資源。
非托管資源
對于非托管資源,您在應用程序中使用完這些非托管資源之后,必須顯示的釋放他們,例如System.IO.StreamReader的一個文件對象,必須顯示的調用對象的Close()方法關閉它,否則會占用系統的內存和資源,而且可能會出現意想不到的錯誤。
最常見的一類非托管資源就是包裝操作系統資源的對象,例如文件,窗口或網絡連接,對于這類資源雖然垃圾回收器可以跟蹤封裝非托管資源的對象的生存期,但它不了解具體如何清理這些資源。還好.netFramework提供了Finalize()方法,它允許在垃圾回收器回收該類資源時,適當的清理非托管資源。如果在MSDNLibrary中搜索Finalize將會發現很多類似的主題,這里列舉幾種常見的非托管資源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip等等資源。可能在使用的時候很多都沒有注意到!
在.NET中很多非托管資源在C#封裝下實現了IDisposable接口,這個接口只有一個待實現的方法Dispose(),在上面提到的類中大都有這個方法,此外還有些類除了調用Dispose()方法可以釋放資源之外,還可以調用Close()方法釋放資源,比如各類數據庫連接(Connection)、各種流(Stream),在調用Close()方法時會自動調用Dispose()方法的。
四、CLI
定義:Common Language Infrastructure公共語言基礎結構,CLI是一組闡述了系統的架構、規則和約定的規范。
五、效率探討:同一段代碼測試托管代碼和非托管代碼效率的對比。 - 無常 - 博客園
結論:
? ? ? ?非托管C:4.609s;
? ? ? ??C++ CLR Console Aplication(代碼是C拷貝):15.172s;
? ? ? ?C++內容用C#完成:62.453s
很顯然,托管肯定沒有不托管直接交互快。
六、CLI執行過程
到目前為止,源代碼已經被編譯成二進制的IL并且包含在程序集中,而且被CLR加載。但是,直接執行運算的CPU來說二進制的IL還是太高級了,而且不同的CPU支持的指令集也有所差異。因此,CLR在這里還需要對已經編譯好的IL再次編譯,針對CPU版本生成可以直接運行的CPU指令,這個過程是由JIT(Just In Time)編譯器完成的,可以稱作"即時編譯"。
當第一次執行某個函數時,MSCorEE.dll 的JITCompiler函數會從程序集的元數據中獲取該方法和方法的IL,并且分配一塊內存地址,然后將IL編譯成的本地代碼放入這塊內存,然后執行內存中的本地代碼。
當再次執行這個函數的時候,由于內存中已經存在JIT編譯好的本地代碼,因此不需要再次進行JIT過程,可以直接執行內存中的本地代碼。 可以預知的結果是,這種情況下應用程序啟動后第一次調用某個模塊所花費的時間要比以后調用這個模塊要稍微多一些。
七、.NET 組成
.NET框架由三部分組成,編譯工具+CLR+FCL(Framework Class Library)。
編譯工具:IDE、.NET兼容的編譯器(支持C#、VB.NET、F#、IronRuby和托管的C++)、調試器;
FCL是一個超類庫,BCL(Base Class Library)也緊緊是它一個子集;
嚴格來說,編譯工具不能算作.NET框架一部分的。
總結
以上是生活随笔為你收集整理的C#基础教程(一).NET框架的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 股市最好用的大数据软件_十大股票软件排名
- 下一篇: 004-集成maven和Spring b
