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