版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄第一部分C#語言概述4第一章.NET編程語言C#41.1Microsoft.NET——一場新的革命41.2.NET與C#61.3C#語言的特點81.4小結11第二章運行環(huán)境全面了解.NET122.1.NET結構122.2公用語言運行時環(huán)境與公用語言規(guī)范132.3開發(fā)工具172.4小結19第三章編寫第一個應用程序203.1Welcome程序203.2代碼分析203.3運行程序23.4添加注釋253.5小結27第二部分C#程序設計基礎28第四章數據類型284.1值類型284.2引用類型334.3裝箱和拆箱394.4小結42第五章變量和常量445.1變量445.2常量465.3小結47第六章類型轉換486.1隱式類型轉換486.2顯式類型轉換536.3小結56第七章表達式587.1操作符587.2算術操作符和算術表達式597.3賦值操作符和賦值表達式647.4關系操作符和關系表達式657.5邏輯操作符和邏輯表達式687.6位運算697.7其它特殊操作符727.8小結77第八章流程控制798.1條件語句798.2循環(huán)語句868.3條件編譯908.4異常處理語句958.5小結100第三部分面向對象的C#101第九章面向對象的程序設計1019.1面向對象的基本概念1019.2對象的模型技術1039.3面向對象的分析1059.4面向對象的設計1079.5小結110第十章類11210.1類的聲明11210.2類的成員11310.3構造函數和析構函數11910.4小結122第十一章方法12411.1方法的聲明12411.2方法中的參數12511.3靜態(tài)和非靜態(tài)的方法12911.4方法的重載13011.5操作符重載13411.6小結137第十二章域和屬性13912.1域13912.2屬性14312.3小結146第十三章事件和索引指示器14813.1事件14813.2索引指示器15113.3小結154第十四章繼承15514.1C#的繼承機制15514.2多態(tài)性15914.3抽象與密封16314.4繼承中關于屬性的一些問題16914.5小結172第四部分深入了解C#174第十五章接口17415.1組件編程技術17415.2接口定義17715.3接口的成員17815.4接口的實現18215.5抽象類與接口19515.6小結196第十六章組織應用程序19816.1基本概念19816.2使用名字空間20016.3使用指示符20316.4程序示例20616.5小結213第十七章文件操作21517.1.Net框架結構提供的I/O方式21517.2文件存儲管理21717.3讀寫文件22217.4異步文件操作22717.5小結234第十八章高級話題23518.1注冊表編程23518.2在C#代碼中調用C++和VB編寫的組件24018.3版本控制24918.4代碼優(yōu)化25218.5小結254第五部分附錄255附錄A關鍵字255附錄B錯誤碼256附錄C.Net名字空間成員速查269第一部分C#語言概述第一章.NET編程語言C#未來5年我們的目標就是超越今天各自為營的Web站點把Internet建成一個可以互相交換組件的地方比爾.蓋茨在本章中你將了解..Microsoft.NET的概念...NET框架..C#語言在.NET框架中的作用及其特性1.1Microsoft.NET一場新的革命1.1.1什么是.NET2000年6月22日不論對Microsoft還是對整個IT業(yè)界都將成為值得紀念的一天這一天微軟公司正式推出了其下一代計算計劃Microsoft.NET(以下簡稱.NET)這項計劃將使微軟現有的軟件在Web時代不僅適用于傳統(tǒng)的PC而且也能夠滿足目前呈強勁增長勢頭的新設備諸如蜂窩電話以及個人數字助理PersonalDigitalAssistant,PDA等的需要微軟還計劃通過創(chuàng)建新的工具來吸引軟件開發(fā)人員和合作伙伴對Microsoft.NET的認同并且開發(fā)出其他基于Internet的服務那么你是否想知道究竟什么是.NET?請聽聽微軟官員的聲音因特網的革命從微軟的角度來講我們就是要建設一個平臺來創(chuàng)建并且支持新一代的應用我們必須有一套通用系統(tǒng)服務來支持這樣的操作這種觀點就說明我們還有下一個層次的發(fā)展也就是說因特網下一步的發(fā)展它將使因特網的作用遠遠超越展現一個網站.NET首先是一個開發(fā)平臺它定義了一種公用語言子集CommonLanguageSubsetCLS,這是一種為符合其規(guī)范的語言與類庫之間提供無縫集成的混合語.NET統(tǒng)一了編程類庫提供了對下一代網絡通信標準可擴展標記語言ExtensibleMarkupLanguageXML的完全支持使應用程序的開發(fā)變得更容易更簡單Microsoft.NET計劃還將實現人機交互方面的革命微軟將在其軟件中添加手寫和語音識別的功能讓人們能夠與計算機進行更好的交流并在此基礎上繼續(xù)擴展功能增加對各種用戶終端的支持能力最為重要的.NET將改變因特網的行為方式軟件將變成為服務與Microsoft的其它產品一樣.NET與Windows平臺緊密集成并且與其它微軟產品相比它更進一步由于其運行庫已經與操作系統(tǒng)融合在了一起從廣義上把它稱為一個運行庫也不為過簡而言之.NET是一種面向網絡支持各種用戶終端的開發(fā)平臺環(huán)境微軟的宏偉目標是讓Microsoft.NET徹底改變軟件的開發(fā)方式發(fā)行方式使用方式等等并且不止是針對微軟一家而是面向所有開發(fā)商與運營商.NET的核心內容之一就是要搭建第三代因特網平臺這個網絡平臺將解決網站之間的協同合作問題從而最大限度地獲取信息在.NET平臺上不同網站之間通過相關的協定聯系在一起網站之間形成自動交流協同工作提供最全面的服務1.1.2我們?yōu)槭裁葱枰?NET某一天你出差到外地在機場租借手機電話在向該終端插入自己的IC卡后自己的地址簿和計劃簿被自動下載隨即它就變成了你個人專用的PDA這不是夢境這是.NET為我們描繪的一個未來生活的場景人們的需要總是無法滿足我們不斷地問自己我們還應該有些什么需求推動著技術的進步在二十一世紀Internet將成為商業(yè)活動的主要場所B2BB2C等電子商務的運作方式一對一營銷的經營概念將網絡的服務功能提高到了前所未有的程度微軟公司在此時提出.NET有其深遠的戰(zhàn)略考慮改革商務模型微軟公司感覺到只靠銷售軟件包的商務模型沒有什么前途該公司打算今后將中心轉移到可以在網絡上使用“服務”型商務這樣首要的問題就是解決網絡上用來開發(fā)并執(zhí)行“服務”的平臺這就是Microsoft.NET提高軟件開發(fā)生產效率并且試圖使應用軟件的發(fā)布更為容易再也不想因為DLL版本不同而煩惱希望不用重新啟動電腦就能夠安裝應用軟件改進用戶界面并能支持多種用戶終端用戶界面演進的結果包括兩方面的內容一是完成傳統(tǒng)的PC界面與基于XML的瀏覽器界面間的過渡二是對自然語言和語音識別的支持從而使用戶與各種終端之間的溝通更加透明真正達到網絡互連的3AAnywhereAnytimeAnydevice今天許多的人時常問除了上網看新聞我們究竟還能干什么這是因為今天的互聯網與舊式的大型計算機的工作模式還有許多相似之處信息被儲存在中央服務器內而用戶的所有操作都要依靠它們讓不同的網址之間相互傳遞有意義的信息或者合作提供更廣泛和更深層次的服務還是一件十分困難的事現代人時常有一種困惑感覺到如今生活在技術與機器架構的叢林中我們在努力地去適應機器適應技術而不是機器和技術適應人類科技以人為本還只是一個美好的愿望這是因為我們還不能將控制信息的權利交給那些需要信息的人們.NET的出現意味著人們可以只用一種簡單的界面就可以編寫瀏覽編輯和分享信息而且還可以得到功能強大的信息管理工具由于使用的所有的文件都以符合網絡協議的格式存在所以所有的商業(yè)用戶和個人用戶都可以方便地查找和使用其中的信息任何規(guī)模的公司都可以使用相同的工具與他們的供應商商業(yè)伙伴和客戶高效地溝通和分享信息這樣就創(chuàng)造出一種全新的協同工作模式總之.NET戰(zhàn)略是一場軟件革命...NET對最終用戶來說非常重要因為計算機的功能將會得到大幅度提升同時計算機操作也會變得非常簡單特別地用戶將完全擺脫人為的硬件束縛用戶可以自由沖浪于因特網的多維時空自由訪問自由查看自由使用自己的數據而不是束縛在便攜式電腦的方寸空間——可通過任何桌面系統(tǒng)任何便攜式電腦任何移動電話或PDA進行訪問并可對其進行跨應用程序的集成...NET對開發(fā)人員來說也十分重要因為它不但會改變開發(fā)人員開發(fā)應用程序的方式而且使得開發(fā)人員能創(chuàng)建出全新的各種應用程序大幅提高軟件生產率.NET將保證完全消除當今計算技術中的所有缺陷.NET定能實現確保用戶從任何地點任何設備都可訪問其個人數據和應用程序的宏偉藍圖...NET把雇員客戶和商務應用程序整和成一個協調的能進行智能交互的整體而各公司無疑將是這場效率和生產力革命的最大受益者.NET承諾為人類創(chuàng)造一個消除任何鴻溝的商務世界1.1.3.NET的核心組件.NET的核心組件包括..一組用于創(chuàng)建互聯網操作系統(tǒng)的構建塊其中包括Passport.NET用于用戶認證以及用于文件存儲的服務用戶首選項管理日歷管理以及眾多的其它任務..構建和管理新一代服務的基本結構和工具包括VisualStudio.NET.NET企業(yè)服務器.NetFramework和Windows.NET..能夠啟用新型智能互聯網設備的.NET設備軟件...NET用戶體驗1.2.NET與C#1.2.1支持多種編程語言的.NET結構框架讓我們翻開教科書回顧一下近十年來軟件開發(fā)的歷史多年以前當微軟的組件對象模型ComponentObjectModel,COM尚未推出時軟件的復用性對于開發(fā)人員僅僅是一種美好的憧憬成千上萬的程序員為了處理通信接口和不同語言間的沖突而通宵達旦地艱辛勞動但卻收效甚微COM的出現改變了這一切通過將組件改變?yōu)橥ㄓ眉尚偷臉嫾_發(fā)人員正逐漸地從過去的繁復編程事務中解脫出來可以選擇自己最得心應手的編程語言進行編程然而軟件組件與應用程序之間的聯合仍然是松散的不同的編程語言與開發(fā)平臺限制了部件間的互用性其結果是產生了日益龐大的應用程序與不斷升級的軟硬件系統(tǒng)舉個很簡單的例子只用五行C語言代碼就能編寫出的一個簡單程序若使用COM來編寫結果會是令人吃驚的我們需要幾百行代碼COM在帶來巨大價值的同時也大大增加了開發(fā)開銷而.NETFramework的出現使得一切問題都迎刃而解實際上在.NETFramework中所有的編程語言從相對簡單的JScript到復雜的C++語言一律是等同的Framework框架是開發(fā)人員對編程語言命令集的稱呼.Net框架的意義就在于只用統(tǒng)一的命令集支持任何的編程語言正如微軟Web服務中心的成組產品經理JohnMontgomery所說只需簡單地一用.NET框架便可消除各種異類框架之間的差異將它們合并為一個整體.NET的作用不僅僅是將開發(fā)人員從必須掌握多種框架的束縛中解脫出來通過創(chuàng)建跨編程語言的公共API集.NET框架可提供強大的跨語言繼承性錯誤處理和調試功能現在開發(fā)人員可以自由地選擇他們喜歡的編程語言.NET平臺歡迎所有人的垂顧”.NET將使編程人員夢想的語言互用性變成為近在眼前的現實想想看一個在VisualBasicVB中定義的類能夠在另一種與它完全不同的語言環(huán)境中使用調試甚至繼承這是多么令人興奮的事情.NET框架是.NET平臺的基礎架構其強大功能來自于公共語言運行時CommonLanguageRuntime,CLR將在第二章中進行詳細的解釋環(huán)境和類庫CLR和類庫包括WindowsFormsADO.NET和ASP.NET緊密結合在一起提供了不同系統(tǒng)之間交叉與綜合的解決方案和服務.NET框架創(chuàng)造了一個完全可操控的安全的和特性豐富的應用執(zhí)行環(huán)境這不但使得應用程序的開發(fā)與發(fā)布更加簡單并且成就了眾多種類語言間的無縫集成1.2.2面向.Net的全新開發(fā)工具C#在最近的一段時間里C和C++一直是最有生命力的程序設計語言這兩種語言為程序員提供了豐富的功能高度的靈活性和強大的底層控制能力而這一切都不得不在效率上作出不同程度的犧牲如果你使用過包括C和C++在內的多種程序設計語言相信你會深刻體會到它們之間的區(qū)別比如與VisualBasic相比VisualC++程序員為實現同樣的功能就要花費更長的開發(fā)周期由于C和C++即為我們帶來了高度的靈活性又使我們必須要忍受學習的艱苦和開發(fā)的長期性許多C和C++程序員一直在尋求一種新的語言以圖在開發(fā)能力和效率之間取得更好的平衡今天人們改進開發(fā)出了許多語言以提高軟件生產率但這些或多或少都以犧牲C和C++程序員所需要的靈活性為代價這樣的解決方案在程序員身上套上了太多的枷鎖限制了他們能力的發(fā)揮它們不能很好地與原有的系統(tǒng)兼容更為令人頭痛的是它們并不總是與當前的Web應用結合得很好理想的解決方案是將快速的應用開發(fā)與對底層平臺所有功能的訪問緊密結合在一起程序員們需要一種環(huán)境它與Web標準完全同步并且具備與現存應用間方便地進行集成的能力除此之外程序員們喜歡它允許自己在需要時使用底層代碼針對該問題微軟的解決方案是一種稱之為C#的程序語言C#是一種現代的面向對象的程序開發(fā)語言它使得程序員能夠在新的微軟.NET平臺上快速開發(fā)種類豐富的應用程序.NET平臺提供了大量的工具和服務能夠最大限度地發(fā)掘和使用計算及通信能力由于其一流的面向對象的設計從構建組件形式的高層商業(yè)對象到構造系統(tǒng)級應用程序你都會發(fā)現C#將是最合適的選擇使用C#語言設計的組件能夠用于Web服務這樣通過Internet可以被運行于任何操作系統(tǒng)上任何編程語言所調用不但如此C#還能為C++程序員提供快捷的開發(fā)方式又沒有丟掉C和C++的基本特征強大的控制能力C#與C和C++有著很大程度上的相似性熟悉C和C++的開發(fā)人員很快就能精通C#1.3C#語言的特點C#在帶來對應用程序的快速開發(fā)能力的同時并沒有犧牲C與C++程序員所關心的各種特性它忠實地繼承了C和C++的優(yōu)點如果你對C或C++有所了解你會發(fā)現它是那樣的熟悉即使你是一位新手C#也不會給你帶來任何其它的麻煩快速應用程序開發(fā)RapidApplicationDevelopmentRAD的思想與簡潔的語法將會使你迅速成為一名熟練的開發(fā)人員正如前文所述C#是專門為.NET應用而開發(fā)出的語言這從根本上保證了C#與.NET框架的完美結合在.NET運行庫的支持下.NET框架的各種優(yōu)點在C#中表現得淋漓盡致讓我們先來看看C#的一些突出的特點相信在以后的學習過程中你將會深深體會到#SHARP的真正含義..簡潔的語法..精心地面向對象設計..與Web的緊密結合..完整的安全性與錯誤處理..版本處理技術..靈活性與兼容性1.3.1簡潔的語法請原諒雖然我們一再強調學習本書不需要任何的編程基礎但在這里還不得不提到C++在缺省的情況下C#的代碼在.NET框架提供的可操控環(huán)境下運行不允許直接地內存操作它所帶來的最大特色是沒有了指針與此相關的那些在C++中被瘋狂使用的操作符例如->和.,已經不再出現C#只支持一個.對于我們來說現在需要理解的一切僅僅是名字嵌套而已C#用真正的關鍵字換掉了那些把活動模板庫ActiveTemplateLibraryALT和COM搞得亂糟糟的偽關鍵字,如OLE_COLORBOOLVARIANT_BOOLDISPID_XXXXX等等每種C#類型在.NET類庫中都有了新名字語法中的冗余是C++中的常見的問題比如const”和#define各種各樣的字符類型等等C#對此進行了簡化只保留了常見的形式而別的冗余形式從它的語法結構中被清除了出去1.3.2精心地面向對象設計也許你會說從Smalltalk開始面向對象的話題就始終纏繞著任何一種現代程序設計語言的確C#具有面向對象的語言所應有的一切特性封裝繼承與多態(tài)這并不出奇然而通過精心地面向對象設計從高級商業(yè)對象到系統(tǒng)級應用C#是建造廣泛組件的絕對選擇在C#的類型系統(tǒng)中每種類型都可以看作一個對象C#提供了一個叫做裝箱boxing與拆箱unboxing的機制來完成這種操作而不給使用者帶來麻煩這在以后的章節(jié)中將進行更為詳細的介紹C#只允許單繼承即一個類不會有多個基類從而避免了類型定義的混亂在后面的學習中你很快會發(fā)現C#中沒有了全局函數沒有了全局變量也沒有了全局常數一切的一切都必須封裝在一個類之中你的代碼將具有更好的可讀性并且減少了發(fā)生命名沖突的可能整個C#的類模型是建立在.NET虛擬對象系統(tǒng)VisualObjectSystemVOS的基礎之上其對象模型是.NET基礎架構的一部分而不再是其本身的組成成分在下面將會談到這樣做的另一個好處是兼容性借助于從VB中得來的豐富的RAD經驗C#具備了良好的開發(fā)環(huán)境結合自身強大的面向對象功能C#使得開發(fā)人員的生產效率得到極大的提高對于公司而言軟件開發(fā)周期的縮短將能使它們更好地應付網絡經濟的競爭在功能與效率的杠桿上人們終于找到了支點1.3.3與Web的緊密結合.NET中新的應用程序開發(fā)模型意味著越來越多的解決方案需要與Web標準相統(tǒng)一例如超文本標記語言HypertextMarkupLanguageHTML和XML由于歷史的原因現存的一些開發(fā)工具不能與Web緊密地結合SOAP的使用使得C#克服了這一缺陷大規(guī)模深層次的分布式開發(fā)從此成為可能由于有了Web服務框架的幫助對程序員來說網絡服務看起來就像是C#的本地對象程序員們能夠利用他們已有的面向對象的知識與技巧開發(fā)Web服務僅需要使用簡單的C#語言結構C#組件將能夠方便地為Web服務并允許它們通過Internet被運行在任何操作系統(tǒng)上的任何語言所調用舉個例子XML已經成為網絡中數據結構傳送的標準為了提高效率C#允許直接將XML數據映射成為結構這樣就可以有效地處理各種數據1.3.4完全的安全性與錯誤處理語言的安全性與錯誤處理能力是衡量一種語言是否優(yōu)秀的重要依據任何人都會犯錯誤即使是最熟練的程序員也不例外忘記變量的初始化對不屬于自己管理范圍的內存空間進行修改這些錯誤常常產生難以預見的后果一旦這樣的軟件被投入使用尋找與改正這些簡單錯誤的代價將會是讓人無法承受的C#的先進設計思想可以消除軟件開發(fā)中的許多常見錯誤并提供了包括類型安全在內的完整的安全性能為了減少開發(fā)中的錯誤C#會幫助開發(fā)者通過更少的代碼完成相同的功能這不但減輕了編程人員的工作量同時更有效地避免了錯誤發(fā)生.NET運行庫提供了代碼訪問安全特性它允許管理員和用戶根據代碼的ID來配置安全等級在缺省情況下從Internet和Intranet下載的代碼都不允許訪問任何本地文件和資源比方說一個在網絡上的共享目錄中運行的程序如果它要訪問本地的一些資源那么異常將被觸發(fā)它將會無情地被異常扔出去若拷貝到本地硬盤上運行則一切正常內存管理中的垃圾收集機制減輕了開發(fā)人員對內存管理的負擔.NET平臺提供的垃圾收集器GarbageCollectionGC將負責資源的釋放與對象撤銷時的內存清理工作變量是類型安全的C#中不能使用未初始化的變量對象的成員變量由編譯器負責將其置為零當局部變量未經初始化而被使用時編譯器將做出提醒C#不支持不安全的指向不能將整數指向引用類型例如對象當進行下行指向時C#將自動驗證指向的有效性C#中提供了邊界檢查與溢出檢查功能1.3.5版本處理技術C#提供內置的版本支持來減少開發(fā)費用使用C#將會使開發(fā)人員更加輕易地開發(fā)和維護各種商業(yè)應用升級軟件系統(tǒng)中的組件模塊是一件容易產生錯誤的工作在代碼修改過程中可能對現存的軟件產生影響很有可能導致程序的崩潰為了幫助開發(fā)人員處理這些問題C#在語言中內置了版本控制功能例如函數重載必須被顯式地聲明而不會像在C++或Java中經常發(fā)生的那樣不經意地被進行這可以防止代碼級錯誤和保留版本化的特性另一個相關的特性是接口和接口繼承的支持這些特性可以保證復雜的軟件可以被方便地開發(fā)和升級1.3.6靈活性和兼容性在簡化語法的同時C#并沒有失去靈活性盡管它不是一種無限制的語言比如它不能用來開發(fā)硬件驅動程序在默認的狀態(tài)下沒有指針等等但是在學習過程中你將發(fā)現它仍然是那樣的靈巧如果需要C#允許你將某些類或者類的某些方法聲明為非安全的這樣一來你將能夠使用指針結構和靜態(tài)數組并且調用這些非安全的代碼不會帶來任何其它的問題此外它還提供了一個另外的東西這樣的稱呼多少有些不敬來模擬指針的功能delegates代表再舉一個例子C#不支持類的多繼承但是通過對接口的繼承你將獲得這一功能下面談談兼容性正是由于其靈活性C#允許與C風格的需要傳遞指針型參數的API進行交互操作DLL的任何入口點都可以在程序中進行訪問C#遵守.NET公用語言規(guī)范CommonLanguageSpecificationCLS從而保證了C#組件與其它語言組件間的互操作性元數據Metadata概念的引入既保證了兼容性又實現了類型安全1.4小結Microsoft.NET計劃將徹底改變我們對因特網的認識從而在這樣一個網絡時代徹底改變我們的生活軟件是一種服務技術是我們的仆人時間與地點將不再是我們面前的障礙建立在CLR與類庫基礎上的.NET框架是.NET平臺的核心組件之一這為軟件的可移植性與可擴展能力奠定了堅實的基礎并為C#語言的應用創(chuàng)造了良好的環(huán)境C#是.NET平臺的通用開發(fā)工具它能夠建造所有的.NET應用其固有的特性保證了它是一種高效安全靈活的現代程序設計語言從最普通的應用到大規(guī)模的商業(yè)開發(fā)C#與.NET平臺的結合將為你提供完整的解決方案在本章中我們提出了與.NET以及與C#語言相關的一些概念例如CLRVOS和GC也許你是初次接觸它們但不用擔心在以后的各章中我們將詳細地介紹這些相關的概念與知識相信通過學習你將能夠迅速掌握它們并熟練地運用它們提供的各種特性復習題1什么是.NET2簡要說明.NET戰(zhàn)略的意義3.NET的核心組件包括哪些4C#與其它語言相比有哪些突出特點第二章運行環(huán)境全面了解.NETC#運行在.NET平臺之上其各種特性與.NET密切聯系它沒有自己的運行庫許多強大的功能均來自.NET平臺的支持因此要想真正掌握C#首先必須了解.NET本章將向你介紹C#的運行環(huán)境重點放在.NET公用語言運行時環(huán)境與公用語言規(guī)范上最后介紹了.NET的開發(fā)工具2.1.NET結構.NET包括四個組成部分..VOS類型系統(tǒng)..元數據..公用語言規(guī)范..虛擬執(zhí)行系統(tǒng)下面分別對它們進行簡要介紹2.1.1虛擬對象系統(tǒng).NET跨語言集成的特性來自于虛擬對象系統(tǒng)VOS的支持在不同語言間進行代碼復用和應用集成中所遇到的最大問題是不同語言類型系統(tǒng)間的相容性問題可以想象不同的語言雖然語法結構大體相同但數據類型與語言環(huán)境本身的各種特點聯系緊密很難想象一種解釋性的語言所擁有的數據類型會與一種編譯語言相同而即使相同的數據類型在不同的語言環(huán)境中表示的意義也存在差別例如同樣是整數類型在MSSQL中的長度是32位而在VB中卻是16位至于日期時間與字符串類型在這方面的區(qū)別就更加明顯了VOS的建立就是為了改變這種狀況它既支持過程性語言也支持面向對象的語言同時提供了一個類型豐富的系統(tǒng)來容納它所支持的各種語言的特性它在最大程度上屏蔽了不同語言類型系統(tǒng)間的轉換使程序員能夠隨心所欲地選擇自己喜歡的語言當然這種語言必須支持.NET應用從事開發(fā)保證了不同語言間的集成對于過程性語言它描述了值的類型并指定了類型的所有值必須遵守的規(guī)則在面向對象的語言方面它統(tǒng)一了不同編程語言的對象模型每一個對象在VOS中都被唯一標識以與其它對象相區(qū)別2.1.2元數據元數據是對VOS中類型描述代碼的一種稱呼在編譯程序將源代碼轉換成為中間代碼時它將自動生成并與編譯后的源代碼共同包含在二進制代碼文件中元數據攜帶了源代碼中類型信息的描述這在一定程度上解決了版本問題程序使用的類型描述與其自身綁定在一起在CLR定位與裝載類型時系統(tǒng)通過讀取并解析元數據來獲得應用程序中的類型信息JIT編譯器獲得加載的類型信息后將中間語言代碼翻譯成為本地代碼在此基礎上根據程序或用戶要求建立類型的實例由于整個過程中CLR始終根據元數據建立并管理對應特定應用程序的類型從而保證了類型安全性此外元數據在解決方法的調用建立運行期上下文界限等方面都有著自己的作用而關于元數據的一切都由.NET在后臺完成2.1.3公用語言規(guī)范公用語言規(guī)范CommonLanguageSpecificationCLS是CLR定義的語言特性集合主要用來解決互操作問題如果一個類庫遵守CLS那么同樣遵守CLS規(guī)范的其它編程語言將能夠使用它的外部可見項詳細的內容見本章第二節(jié)2.1.4虛擬執(zhí)行系統(tǒng)虛擬執(zhí)行系統(tǒng)VisualExecutionSystemVES是VOS的實現它用來驅動運行環(huán)境元數據的生成與使用公用語言規(guī)范的滿足性檢查以及應用程序執(zhí)行過程中的內存管理均由它來完成具體說來VES主要完成以下功能..裝入中間代碼..使用JIT將中間代碼轉換為本地碼..裝入元數據..代碼管理服務包括垃圾收集器和異常處理..定制與調試服務..線程和環(huán)境管理2.2公用語言運行時環(huán)境與公用語言規(guī)范了解了.NET的結構之后我們該看看.NET利用其結構為我們創(chuàng)造的運行環(huán)境公用語言運行時環(huán)境它是C#及其它支持.NET平臺的開發(fā)工具的運行基礎具體來說它為我們的應用提供了以下益處..跨語言集成的能力..跨語言異常處理..內存管理自動化..強化的安全措施..版本處理技術..組件交互的簡化模型2.2.1理解CLR.NET提供了一個運行時環(huán)境叫做公用語言運行時它管理著代碼的執(zhí)行并使得開發(fā)過程變得更加簡單這是一種可操控的執(zhí)行環(huán)境其功能通過編譯器與其它工具共同展現你的代碼將受益于這一環(huán)境依靠一種以運行時為目標的指完全支持運行時環(huán)境的編譯器所開發(fā)的代碼叫做可操控代碼它得益于可操控環(huán)境的各種特性跨語言集成跨語言異常處理增強的安全性版本處理與開發(fā)支持簡單的組件交互模型以及調試服務為了使運行時環(huán)境能夠向可操控代碼提供服務語言編譯器需要產生一種元數據它將提供在你使用語言中的類型成員引用的信息元數據與代碼一起存儲每個可加載的CLR映像均包含了元數據運行時環(huán)境使用元數據定位并載入類在內存中展開對象實例解決方法調用產生本地代碼強制執(zhí)行安全性并建立運行時環(huán)境的邊界運行時環(huán)境自動處理對象的展開與引用當它們不再使用時負責它們的釋放被運行時環(huán)境進行這樣的生命期管理的對象被稱為可操控代碼自動內存管理消除了內存溢出同時也解決了其它一些常見的語法錯誤如果你的代碼是可操控的你仍然可以在需要的時候使用非可控代碼或者在你的.NET應用中同時使用可控與非可控代碼由于語言編譯器支持他們自己的類型比如一些原始類型你可能并不總是知道也不必知道你的數據是否是可控的CLR使設計跨語言的組件與應用變得更加容易以不同語言設計的對象能夠彼此間進行通信并且它們的行為能夠緊密地綜合與協調舉個例子你定義了一個類然后可以在另一種不同的語言中從該類中派生了一個類或者調用它其中的一個方法你也可以向另一種語言中類的方法傳遞該類的一個實例這種跨語言的集成之所以可能因為以運行時間為目標的語言編譯器與工具使用一種運行時間所定義的公用類型系統(tǒng)他們遵守運行時的規(guī)則公用語言規(guī)范來定義新的類型生成使用保持并綁定類型作為元數據的一部分所有可控組件攜帶了關于它們所依賴的組件與資源的信息運行時環(huán)境使用這些信息來保證你的組件或應用具有需要的所有東西的特定版本其結果是你的代碼將不會因為版本沖突而崩潰注冊信息與狀態(tài)數據不再保存在難以建立與維護的注冊表中你所定義的類型及附屬信息作為元數據被保存這使得復制與移動組件的復雜程度得到降低編譯工具用他們自己的方式向開發(fā)人員展現CLR的功能這意味著運行時間的一些特性可能在不同的語言中的表現形式將會有所不同你怎樣體驗運行時的特性將取決于你所使用的語言比如說如果你是一位VB開發(fā)人員你可能注意到在運行時環(huán)境的幫助下VB語言比以前具有更多的面向對象的特性2.2.2可操控執(zhí)行的含義前面的敘述中我們多次提到了可操控這一概念這意味著它指向的對象在執(zhí)行過程中完全被運行時環(huán)境所控制在執(zhí)行過程中運行時環(huán)境提供以下服務自動內存管理調試支持增強的安全性及與非可操控代碼的互操作性例如COM組件在可控執(zhí)行進程中的第一步是選擇源代碼的生成工具如果你希望你的應用擁有CLR提供的優(yōu)勢你必須使用一種或多種以運行時為目標的語言編譯器例如VBC#VC的編譯器或者一種第三方編譯器如PERL或COBOL編譯器由于運行時是一種多語言執(zhí)行環(huán)境它支持眾多的數據類型和語言特性你使用的語言編譯器決定你將使用運行時的哪一部分功能子集在代碼中使用的語法由你的編譯器決定而不是運行時環(huán)境如果你的組件需要被其他語言的組件完全使用那么你必須在你組件的輸出類型中使用CLR所要求的語言特征當你完成并編譯你的代碼時編譯器將它轉換為微軟中間語言MicrosoftIntermediateLanguageMSIL同時產生元數據當你要執(zhí)行你的代碼時這種中間語言被即時JustInTimeJIT編譯器編譯成為本地代碼如果安全策略需要的代碼是類型安全的通常情況下都是如此JIT編譯器將在編譯進程中對中間語言進行類型檢查一旦失敗在代碼執(zhí)行中將會觸發(fā)異常2.2.3CLR的突出特色跨語言集成的能力CLR包含了一個豐富的語言特性集保證了它與各種程序設計語言的兼容性這一特性集即公用語言規(guī)范稍后將對其進行詳細說明內存管理自動化在執(zhí)行過程中管理應用程序的資源是一項單調而困難的工作它會將你的注意力從你本應解決的問題中引開而垃圾收集機制完全解決了程序員在編程過程中頭痛的問題跟蹤內存的使用并知道何時將它們釋放在面向對象的環(huán)境中每種類型都標識了對你的應用有用的某種資源為了使用這些資源你需要為類型分配內存在應用中訪問一種資源要通過以下步驟1為類型分配內存2初始化內存設置資源的初始狀態(tài)并使其可用3通過訪問該類型的實例成員來訪問資源4卸下將被清除的資源狀態(tài)5釋放內存這一看似簡單的過程在實際的編程中是產生程序錯誤的主要來源之一更可怕的是內存中的錯誤往往導致不可預見的結果如果你有過編程的經驗想想看有多少次你的程序因為內存訪問錯誤而崩潰CLR要求所有的資源從可操控的堆注在此指一種內存結構中分配當一個進程被初始化后CLR保留了一個未被分配的地址空間這一區(qū)域叫做可操控堆在堆中保持了指向下一個將被分配給對象的堆地址的指針NEXT初始狀態(tài)下該指針是保留地址空間的基地址一個應用使用新的操作產生對象此操作首先檢查新對象需要字節(jié)的大小是否會超出保留空間如果對象大小合適指向下一個地址的指針將指向堆中的這個對象該對象的構造器被調用新的操作返回對象的地址當一個應用請求建立一個對象時地址空間可能不夠大堆將發(fā)現這一點通過將新對象的大小與NEXT指針相加并與堆的大小進行比較這時垃圾收集器就將被調用在這里CLR引入了代的概念代指堆中對象產生的先后這樣垃圾收集器在將發(fā)生溢出時回收屬于特定的代的對象而不是回收堆中的所有對象6即時編譯在各種語言的編譯器對源代碼進行編譯之后在CLR環(huán)境中產生的是中間代碼出于兼容性與跨語言集成的考慮其內容雖然有效但在轉化為本地代碼之前它本身是不可執(zhí)行的這就是JIT編譯器需要完成的工作這里需要說明一個問題為什么要即時編譯而不是一次性的將中間代碼文件進行編譯答案很簡單原因在于效率在大型的應用中你很少會用到程序的全部功能這種邊執(zhí)行邊編譯的措施比一次性的完全編譯效率更高在Windows平臺中CLR帶有三個不同的JIT編譯器7缺省的編譯器主編譯器由它進行數據流分析并輸出經過優(yōu)化的本地代碼所有的中間代碼指令均可被它處理8PREJIT它建立在主JIT編譯器之上其運行方式更像一個傳統(tǒng)的編譯器每當一個.NET組件被安裝時它就運行9ECONOJIT在并不充分優(yōu)化的前提下它能夠快速完成IL代碼到本地碼的轉換編譯速度與運行速度都很快為了配合編譯器的工作在.NETSDK的安裝路徑下的/bin目錄中有一個負責管理JIT的應用程序jitman.exe具體的使用參見聯機幫助10解決版本與發(fā)布問題在當前以組件為基礎的系統(tǒng)中開發(fā)人員和用戶對于軟件版本和發(fā)布中存在的問題已經十分熟悉了當我們安裝一個新的應用之后我們很可能發(fā)現原本正常的某個應用程序奇怪地停止了工作絕大多數開發(fā)人員將時間花在了確保所有注冊表入口的一致性以便激活COM類上這就是所謂的DLL地獄.NET平臺通過使用集合來解決這一問題在這里集合是一個專有名詞指類型與資源的發(fā)布單元在很大程度上它等同于今天的DLL正像.NET用元數據描述類型一樣它也用元數據描述包含類型的集合通常說來集合由四個部分組成集合的元數據集合的內部清單元數據描述的類型實現類型的中間語言代碼和一組資源在一個集合中以上四個部分并不是都必須存在但是集合中必須包含類型或資源這樣集合才有意義在.NET中一個基本的設計方針是使用孤立的組件一個孤立的集合的含義是指一個集合只能被一個應用所訪問在一臺機器上它不被多個應用共享也不會受其它應用程序對系統(tǒng)的更改的影響孤立賦予了開發(fā)人員在自己的程序中對代碼的完全控制權任何共享代碼都需要被明確地標識同時.NET框架也支持共享集合的概念一個共享集合指在一臺機器上被多個應用共享的集合共享集合需要嚴格地命名規(guī)定有了.NET應用程序間的共享代碼是明確定義的共享集合需要一些額外的規(guī)則來避免我們今天遇到的共享沖突問題共享代碼必須有一個全局唯一的名稱系統(tǒng)必須提供名稱保護并在每當引用共享集合時CLR將對版本信息進行檢查此外.NET框架允許應用或管理員在明確說明的版本政策下重寫集合的版本信息2.2.4公用語言規(guī)范使被不同語言的編譯器所編譯的對象能夠相互理解的唯一方法是所有在互操作過程中涉及的數據類型和語言特性對所有的語言來說是公共的為了這個目的公用運行時環(huán)境標識了一組語言特征的集合稱為公用語言規(guī)范CLS如果你的組件在應用程序接口ApplicationProgramInterface中僅使用CLS的特征語言包括子類那么該組件能夠被任何支持CLS的語言所編譯的組件訪問所有支持CLS并僅使用CLS中的語言特征的組件被稱為符合CLS的組件設計公用語言規(guī)范時遇到的一個最主要的挑戰(zhàn)是選擇適當的語言特性子集的大小它應具有完全的表達能力又應足夠小使得所有的語言能夠容納它由于CLS是關于語言互用性的規(guī)范它的規(guī)則僅應用于外部可見的條目中CLS假設語言間的互操作性僅在語言集合的邊界發(fā)生交叉時才是重要的也就是說在單一的語言集中對于編程技術的使用沒有任何限制CLS的規(guī)則僅作用于在定義它們的語言集合之外仍然可見的項上這樣就大大縮小了CLS的范圍減輕了系統(tǒng)的負擔在CLS中是用System.CLSCompliantAttribute類來標識一個集合或者類是否是符合CLS規(guī)范的在System.CLSCompliantAttribute的構造器中有一個Boolean型的返回值代表了與之相關聯的項是否符合CLS規(guī)范2.3開發(fā)工具.NET為使用與開發(fā)人員提供了功能強大種類豐富的管理與開發(fā)工具同時它們也是.NET框架提供的服務我們將它們列在下面正是由于有了它們的支持.NET才變得如此強大1.VisualStudio.NET是.NET的核心開發(fā)工具包括微軟提供的各種開發(fā)語言其中有VisualC#2.AssemblyGenerationUtility(al.exe)用來建立集合的工具它能夠將資源文件或MSIL格式的文件轉換為帶有內容清單的集合3.WindowsFormsActiveXControlImporter(aximp.exe)完成COM類庫中類型定義的轉換使ActiveX控件能夠在Windows窗口控件上使用4.CodeAccessSecurityPolicyUtility(caspol.exe)在用戶與機器水平上修改安全策略5.SoftwarePublisherCertificateTestUtility(Cert2spc.exe)用于從X.509證書中生成軟件出版證明書SPC6.CertificateManagerUtility(certmgr.exe)管理證書證書信任列表和證書回收列表7.CertificateVerificationUtility(chktrust.exe)檢查證書簽名的合法性8.RuntimeDebugger(cordbg.exe)運行時調試器是一個命令行程序幫助開發(fā)人員發(fā)現和調試基于CLR的應用程序中的錯誤9.GlobalAssemblyCacheUtility(gacutil.exe)允許你瀏覽與操縱全局集合緩存中內容的命令行程序10.MSILAssembler(ilasm.exe)MSIL匯編程序協助設計與實現MSIL生成器的程序11.MSILDisassembler(ildasm.exe)MSIL反匯編程序與ilasm.exe共同使用將由MSIL代碼產生的PortableExecutable文件轉換為文本文件12.InstallerUtility(installutil.exe)用來安裝與卸載服務資源13.LicenseCompiler(lc.exe)產生可包含在可執(zhí)行二進制文件中的二進制資源文件14.CertificateCreationUtility(makecert.exe)生成X.509證書與用于數字簽名的公用與私有密鑰15.PermissionsViewUtility(permview.exe)通過一個集合瀏覽許可集的工具16.PeverifyUtility(peverify.exe)檢查中間語言與元數據是否符合類型安全認證要求17.AssemblyRegistrationTool(RegAsm.exe)讀取集合中的元數據并加上必要注冊表入口信息使得COM客戶透明地建立CLR的類18.ServicesRegistrationTool(RegSvcs.exe)服務注冊工具它完成執(zhí)行以下功能裝載與注冊一個集合為現有的COM+1.0應用生成注冊與安裝類庫19.ResourceFileGeneratorUtility(ResGen.exe)資源文件生成器用來將文本文件和XML格式的資源文件轉換為CLR的二進制文件20.SecutilUtility(SecUtil.exe)使得從集合中抽取的安全信息更加容易21.SetRegistryUtility(setreg.exe)改變注冊表中公開密鑰密碼系統(tǒng)的設置22.AssemblyCacheViewer(shfusion.dll)允許你使用Windows瀏覽器察看與操作全局集合緩存中的內容23.FileSigningUtility(signcode.exe)為PE(portableexecutable)文件做標記賦予程序員在組件安全約束的基礎上對安全性有更多的控制權24.SharedNameUtility(Sn.exe)幫助程序員以共享名稱建立集合25.SoapsudsUtility(SoapSuds.exe)使用遠程技術幫助你編譯與Web服務相通信的客戶應用26.IsolatedStorageUtility(storeadm.exe)一種用來管理隔離存儲區(qū)的命令行工具27.TypeLibraryExporter(TlbExp.exe)命令行程序生成由集合名稱指示的包含集合中公共類型定義的類庫28.TypeLibraryImporter(TlbImp.exe)將COM類庫中的類型定義轉換為在CLR中與元數據格式一致的類型定義29.WebServiceUtility(WebServiceUtil.exe)幫助建立ASP.NETWeb服務與客戶30.WindowsFormsClassViewer(wincv.exe)能夠在某種查找模式下快速查找類或者類序列的信息31.WindowsFormsDesignerTestContainer(windes.exe)允許開發(fā)人員測試開發(fā)出的視窗窗體控件在設計時的行為32.XMLSchemaDefinitionTool(xsd.exe)XML計劃定義工具2.4小結本章解釋了與.NET有關的概念并簡要介紹了一些相關的技術在了解了.NET的結構之后我們重點討論了公用語言運行時環(huán)境和公用語言規(guī)范最后給出了.NET開發(fā)工具的清單在完成本章的學習之后你已經了解了有關C#運行環(huán)境的相關知識這將為你深入學習C#打下良好的基礎從下一章開始我們將進入實際的編程實踐中您將會發(fā)現關于C#的更多更有趣的東西復習題1.NET的結構由哪四部分組成2請簡要總結CLR的作用3可操控執(zhí)行的含義是什么4.NET是怎樣解決傳統(tǒng)Windows程序設計中DLL的版本問題的5什么是CLS它的范圍是怎樣確定的第三章編寫第一個應用程序介紹了C#語言的這么多優(yōu)點您可能已經有些不耐煩了好那就讓我們開始C#的開發(fā)之路吧本章介紹如何生成您的第一個C#程序這是一個最基本的C#應用程序程序中的代碼在全書中將經常出現我一直堅信只有不斷練習才是最好的學習方式所以建議讀者從本章開始對書中所提供的程序示例親自進行編輯編譯和運行在這個過程中您將獲得開發(fā)C#程序的有益經驗3.1Welcome程序可以這么說與用戶沒有任何交互的應用程序根本沒有任何用處病毒和黑客當然除外然而即使是病毒程序的作者也常常喜歡在自己得逞之后炫耀一番學習任何一門語言絕大多數情況下人們都是從輸入輸出開始的第一個程序總是非常簡單的我們讓用戶通過鍵盤輸入自己的名字然后程序在屏幕上打印一條歡迎信息程序的代碼是這樣的程序清單3-1usingSystem;classWelcome{staticvoidMain(){Console.WriteLine("Pleaseenteryourname:");Console.ReadLine();Console.WriteLine("Welcometoyou!");}}您可以在任意一種編輯軟件中完成上述代碼的編寫然后把文件存盤文件名叫做Welcome.cs典型的C#源文件通常都是以.cs作為文件的擴展名3.2代碼分析首先要提出的是C#語言是大小寫敏感的這一點對于C和C++程序員沒什么問題只是要提醒一下VB和Delphi的程序員接下來讓我為您逐條地分析上面的C#程序語句3.2.1名字空間usingSystem表示導入名字空間高級語言總是依賴于許多系統(tǒng)預定義的元素如果您是C或C++的程序員那么您一定對使用#include之類的語句來導入其它C或C++源文件再熟悉不過了C#中的含義與此類似用于導入預定義的元素這樣在自己的程序中就可以自由地使用這些元素如果沒有導入名字空間的話我們該怎么辦呢程序還能保持正確嗎答案是肯定的那樣的話我們就必須把代碼改寫成下面的樣子程序清單3-2classWelcome{staticvoidMain(){System.Console.WriteLine("Pleaseenteryourname:");System.Console.ReadLine();System.Console.WriteLine("Welcometoyou!");}}也就是說在每個Console前加上一個前綴System.這個小原點.表示Console是作為System的成員而存在的C#中拋棄了C和C++中繁雜且極易出錯的操作符像::和->等C#中的復合名字一律通過.來連接System是.Net平臺框架提供的最基本的名字空間之一有關名字空間的詳細使用方法我們將放在第十七章中詳細介紹在這里只要我們學會怎樣導入名字空間就足夠了3.2.2類和類的方法讓我們從寫第一個程序時就記住每個東西都必須屬于一個類如果您是C或C++的程序員請暫時忘掉那些全局變量在程序的第二行classWelcome聲明了一個類類的名字叫做Welcome這個程序為我們所作的事情就是依靠它來完成的和CC++中一樣源代碼塊被包含在一對大括號{和}中每一個右括號}總是和它前面離它最近的一個左括號{相配套如果左括號{和右括號}沒有全部配套那程序就是一個錯誤的程序staticvoidMain()表示類Welcome中的一個方法方法總是為我們完成某件工作的注意在C#程序中程序的執(zhí)行總是從Main()方法開始的一個程序中不允許出現兩個或兩個以上的Main()方法對于習慣了寫C控制臺程序的讀者請牢記C#中Main()方法必須被包含在一個類中3.2.3程序的輸入和輸出程序所完成的輸入輸出功能都是通過Console來完成的Console究竟是什么呢它是在名字空間中System已經為我們定義好的一個類這里我們不用管它是怎么完成工作的只要使用它就可以了上面的代碼中類Console為我們展現了兩個最基本的方法WriteLine和ReadLineConsole.ReadLine表示接受輸入設備輸入Console.WriteLine則用于在輸出設備上輸出我們再為讀者介紹Console中用于輸入輸出的另兩個方法Read和Write它們和ReadLine與WriteLine的不同之處在于ReadLine和WriteLine執(zhí)行時相當在顯示時多加了一個回車鍵而使用Read和Write時則光標不會自動轉移到下一行讓我們再對例子程序進行擴展使得用戶的輸入對輸出產生作用程序清單3-3usingSystem;classWelcome{staticvoidMain(){Console.WriteLine("Pleaseenteryourname:");stringname=Console.ReadLine();Console.WriteLine("Welcometoyou,{0}!",name);}}我們用到了stringname=Console.ReadLine()這條語句其中stringname表示聲明一個字符串類型的變量name系統(tǒng)定義的Console類提供的方法ReadLine()的返回值類型為string所以這句話表示從輸入設備讀取一個字符串并把讀取的值賦予變量name再來看一下程序的最后一條輸出語句Console.WriteLine("Welcometoyou,{0}!",name);這條語句表示在屏幕上對輸出的字符串進行格式化其中表示用方法的第二個參數來替代格式化后字符串相應的位置對字符串進行格式化的參數可以是一個字符串也可以是一個字符或者是一個整數等等采用這種方式最多可以格式化三個變量比如intx=3;stringname1=“Mike”;stringname2=“John”;Console.WriteLine("Welcometoyou{0}times,{1}and{2}!",x,name1,name2);和絕大多數編程語言一樣C#提供了字符串類型string它與C中的MFC為我們提供的類十分類似C#中的string類型是一個引用類型引用類型在第四章中我們有詳細說明為標準字符集利用string可以方便地對字符串進行連接截斷等操作比如strings=“Good”+“Morning”;charx=s[3];例子演示了字符串s由兩個字符串Good和Morning相加得到字符串還可以通過下標進行索引得到一個字符上面的例子中字符x的值為o所以源程序3-4和源程序3-3的作用沒什么區(qū)別程序清單3-4usingSystem;classWelcome{staticvoidMain(){Console.WriteLine("Pleaseenteryourname:");stringmessage=“Welcometoyou“+Console.ReadLine();Console.WriteLine(message);}}3.3運行程序理解了源程序中每條代碼的具體含義之后下一步要做的就是讓這個程序真正能夠運行不過對源代碼即使還有不明白的地方也沒有關系在后續(xù)章節(jié)的學習中您最終會熟練掌握這些概念的如果您的電腦上安裝了VisualStudio.Net則可以在集成開發(fā)環(huán)境IntegratedDeveloperEnvironmentIDE中直接選擇快捷鍵或菜單命令編譯并執(zhí)行源文件如果您不具備這個條件那么您至少需要安裝Microsoft.NetFrameworkSDK這樣才能夠不妨礙您在本書中繼續(xù)學習C#語言實際上.Net平臺內置了C#的編譯器下面讓我們使用這個微軟提供的命令行編譯器對我們的程序進行編譯啟動一個命令行提示符在屏幕上輸入一行命令cscwelcome.cs我們假設您已經將welcome.cs文件保存在當前目錄下如果一切正常welcome.cs文件將被編譯運行屏幕上出現一行字符提示您輸入姓名Pleaseenteryourname:輸入任意個字符并按下回車鍵屏幕將打印出歡迎信息Welcometoyou!注意和到目前為止我們使用過的絕大多數編譯器不同在C#中編譯器只執(zhí)行編譯這個過程而在C和C++中要經過編譯和鏈接兩個階段換而言之C#源文件并不被編譯為目標文件.obj而是直接生成可執(zhí)行文件.exe或動態(tài)鏈接庫.dllC#編譯器中不需要包含鏈接器編譯選項我們可以靈活地使用.Net平臺提供的命令行編譯器的不同選項選擇不同的編譯方式從而靈活地對編譯進行控制例如如果我們希望對源文件Welcome.cs進行編譯生成名為MyWelcome.exe的可執(zhí)行文件我們可以采用這樣的命令csc/out:MyWelcome.exeWelcome.cs如果我們并不需要一個可執(zhí)行文件而僅僅是希望簡單地檢查源文件中是否存在語法錯誤則命令可以寫成csc/nooutput:Welcome.cs如果不知道各個選項的具體含義可以通過求助來獲得csc/?為方便讀者我們在表3-1中按字母排序的順序列出了命令行編譯器csc常用的參數及其用途更詳細的信息請參閱C#聯機幫助文檔表3-1命令行編譯器選項選項作用@指定響應文件/?列出編譯命令選項/addmodule指定一個或多個模塊作為裝配的一部分/baseaddress指定載入動態(tài)鏈接庫的首選地址/bugreport生成一個報告文件其中包含程序Bug的詳細信息/checked指定算術運算的溢出是否會導致程序在運行時拋出一個異常/codepage指定編譯的所有源文件所使用的代碼頁/debug給出調試信息/define定義預處理程序的符號/doc由文件注釋生成XML文件/fullpaths指定輸出的絕對路徑/help列出編譯命令選項/incremental允許對源文件進行遞增式編譯/linkresource在裝配時鏈接指定的NET資源/main指定Main方法所處的位置/nologo編譯過程中不顯示編譯信息/nooutput編譯源文件但不輸出/nostdlib不導入標準庫(mscorlib.dll).續(xù)表選項作用/nowarn編譯過程中不生成警告信息/optimize指定編譯時是否進行優(yōu)化/out指定輸出文件/recurse搜索子目錄以尋找源文件/reference從包含裝配的文件中導入元數據/resource把NET資源內嵌到輸出文件/target指定輸出文件的格式/target:exe輸出文件為exe可執(zhí)行文件/target:library輸出文件為鏈接庫/target:module輸出文件為模塊/target:winexe輸出文件為winexe可執(zhí)行文件/unsafe允許編譯使用了不安全關鍵字的代碼/warn設置警告級別/warnaserror把警告信息作為錯誤看待/win32icon把.ico圖標文件插入到輸出文件/win32res把Win32資源插入到輸出文件.4添加注釋應用程序并不是只要你自己一個人能看懂就夠了不管以前計算機老師或者是編程書籍是否已經告誡過這里我還要再一次強調養(yǎng)成良好的代碼注釋的習慣這是一名優(yōu)秀的程序員必備的條件之一代碼注釋不會浪費您的編程時間它只會提高您的編程效率使您的程序更加清晰完整友好注釋的方式和++沒有區(qū)別每一行中雙斜杠后面的內容以及在分割符和之間的內容都將被編譯器忽略這樣我們就可以采用進行單行注釋采用分割符和進行多行注釋讓我們對Welcome程序加上注釋程序清單3-5源文件welcome.cs/說明這里是我的第一個程序usingSystem;classWelcome{staticvoidMain(){Console.WriteLine("Pleaseenteryourname:");要求用戶輸入姓名Console.ReadLine();讀取用戶輸入Console.WriteLine("Welcometoyou!");本行代碼用于打印歡迎信息您可以在這里添加自己的代碼程序在這里結束}}上面的注釋似乎有些小題大做但它畢竟說明了中注釋的使用方法下面是對程序進行注釋時要注意的兩個問題首先避免在之后的單行注解中使用反斜杠符號\因為反斜杠符號\在中是一個續(xù)行符這樣做往往會導致你所不希望的結果出現例如當你寫了類似于下面的代碼Console.WriteLine(“Theresultis:{0}”,//\150);在編譯這段代碼時表示邏輯上同一行剩余的所有文字被作為注釋看待而續(xù)行符\則將這一行同下一行連接起來那么第二行也被作為注釋的一部分這時編譯器找不到與第一行的左括號相匹配的右括號因此編譯出錯其次分割符和之間的注釋不能有嵌套注釋這是因為編譯器從遇到第一個分割符開始將忽略下一個直到遇上下一個與之匹配的分割符才認為注釋結束這樣編譯器就會對多余的報告錯誤認為沒有與之相匹配一些程序員經常習慣于把程序中不需要或暫時不需要的代碼片段首尾分別加上分割符和這時如果這些代碼片段本身又含有注釋的話我們所討論的這種錯誤就會發(fā)生這時我們建議您換一種方式把預處理語句if#endif等貫穿在程序中使用因為它們可以強制編譯器忽略已包含注釋的源代碼片段從而通過這種方式來實現源代碼的嵌套注釋以上提到的在注釋中可能發(fā)生的兩種問題如果編譯器報告錯誤那已經是很幸運的了如果是原本錯誤的程序被誤認為是正確的加以編譯或者程序代碼的原意因此被曲解造成的錯誤往往很難發(fā)現那時造成的后果將會嚴重得多3.5小結在本章中我們寫了第一個C#程序Welcome通過對該程序的分析和理解我們學習到了..如何在應用程序中與用戶進行交互..如何通過System預定義的類Console提供的方法來進行輸入輸出和對字符串進行格式化..如何編譯C#源文件..如何向代碼中添加注釋復習題1C#程序通常都是如何開始執(zhí)行的2Console類為我們提供了那些輸入輸出的手段3說明如何使用編譯器生成不同類型的輸出文件4對源代碼進行注釋是必須的嗎為什么5說說在C#代碼中添加注釋要注意那些問題第二部分C#程序設計基礎第四章數據類型應用程序總是需要處理數據而現實世界中的數據類型多種多樣我們必須讓計算機了解需要處理什么樣的數據以及采用哪種方式進行處理按什么格式保存數據等等比如在編碼程序中需要處理單個字符在定購票系統(tǒng)需要打印貨幣金額在科學運算中不同情況下我們需要不同精度的小數這些都是不同的數據類型其實任何一個完整的程序都可以看成是一些數據和作用于這些數據上的操作的說明每一種高級語言都為開發(fā)人員提供一組數據類型不同的語言提供的數據類型不盡相同在本書第一部分我們?yōu)樽x者簡要地介紹了C#語言的主要特點和運行環(huán)境并且創(chuàng)建了第一個簡單的C#應用程序本章將會給你介紹C#的數據類型系統(tǒng)在這一章中你將系統(tǒng)地學習C#語言為我們提供的數據類型以及使用這些數據類型時的要點對于程序中的每一個用于保存信息的量使用時我們都必須聲明它的數據類型以便編譯器為它分配內存空間C#的數據類型可以分為兩大部分值類型和引用類型如果你是一名編程新手本章將是你繼續(xù)學習C#的基礎應該牢牢掌握本章提到的各種數據類型而對于有一定C和C++經驗的讀者來說對本章的內容不會感到困難但在閱讀本章和緊接著的幾章里要把注意力集中到文章中C#獨有的特點尤其是與C和C++的區(qū)別這才是關鍵所在4.1值類型在具體講解各種類型之前我們先提一下變量的概念在下一章我們將對變量作進一步的討論從用戶角度來看變量就是存儲信息的基本單元從系統(tǒng)角度來看變量就是計算機內存中的一個存儲空間下面我們開始介紹值類型C#的值類型可以分為以下幾種..簡單類型Simpletypes..結構類型Structtypes..枚舉類型Enumerationtypes簡單類型有時人們也稱為純量類型是直接由一系列元素構成的數據類型C#語言中為我們提供了一組已經定義的簡單類型從計算機的表示角度來看這些簡單類型可以分為整數類型布爾類型字符類型和實數類型4.1.1整數類型顧名思義整數類型的變量的值為整數數學上的整數可以從負無窮大到正無窮大但是由于計算機的存儲單元是有限的所以計算機語言提供的整數類型的值總是在一定的范圍之內C#中有九種整數類型短字節(jié)型sbyte字節(jié)型byte短整型short無符號短整型ushort整型int無符號整型uint長整型long無符號長整型ulong劃分的依據是根據該類型的變量在內存中所占的位數位數的概念是按照2的指數冪來定義的比如說8位整數則它可以表示2的8次方個數值即256這和我們在Windows系統(tǒng)中顯示屬性是一樣的比如16位真彩色表示一共可以顯示2的16次方即65536種顏色這些整數類型在數學上的表示以及在計算機中的取值范圍如表4-1中所示表4-1整數類型數據類型特征取值范圍sbyte有符號8位整數在-128到127之間byte無符號8位整數在0到255之間short有符號16位整數在-32,768到32,767之間ushort無符號16位整數在0到65,535之間int有符號32位整數在-2,147,483,648到2,147,483,647之間uint無符號32位整數0到4,294,967,295之間long有符號64位整數在9,223,372,036,854,775,808和9,223,372,036,854,775,807之間ulong無符號64位整數0和18,446,744,073,709,551,615之間程序清單4-1usingSystem;classTest{publicstaticvoidMain(){shortx=32766;x++;Console.WriteLine(x);x++;Console.WriteLine(x);}}程序的輸出為32767-32768上面的例子說明對于short類型的整數x已經超出了系統(tǒng)定義的范圍從-32768到32767之間4.1.2布爾類型布爾類型是用來表示真和假這兩個概念的這雖然看起來很簡單但實際應用非常廣泛我們知道計算機實際上就是用二進制來表示各種數據的即不管何種數據在計算機的內部都是采用二進制方式處理和存儲的布爾類型表示的邏輯變量只有兩種取值真或假在C#中分別采用true和false兩個值來表示注意在C和C++中用0來表示假其它任何非0的式子都表示真這種不正規(guī)的表達在C#中已經被廢棄了在C#中true值不能被其他任何非零值所代替在其它整數類型和布爾類型之間不再存在任何轉換將整數類型轉換成布爾型是不合法的boolx=1//錯誤不存在這種寫法只能寫成x=true或x=false4.1.3實數類型浮點類型數學中的實數不僅包括整數而且包括小數小數在C#中采用兩種數據類型來表示單精度float和雙精度double它們的差別在于取值范圍和精度不同計算機對浮點數的運算速度大大低于對整數的運算在對精度要求不是很高的浮點數計算中我們可以采用float型而采用double型獲得的結果將更為精確當然如果在程序中大量地使用雙精度類浮點數將會占用更多的內存單元而且計算機的處理任務也將更加繁重..單精度取值范圍在正負45105.1.×到38104.3×之間精度為7位數..雙精度取值范圍在正負324100.5.×到308107.1×之間精度為15到16位數十進制類型C#還專門為我們定義了一種十進制類型(decimal)主要用于方便我們在金融和貨幣方面的計算在現代的企業(yè)應用程序中不可避免地要進行大量的這方面的計算和處理而目前采用的大部分程序設計語言都需要程序員自己定義貨幣類型等這不能不說是一個遺憾C#通過提供這種專門的數據類型為我們彌補了這一遺憾使我們能夠更為快捷地設計這方面的應用程序十進制類型是一種高精度128位數據類型它所表示的范圍從大約1.0×10-28到7.9×1028的28至29位有效數字注意該精度是用位數(digits)而不是以小數位(decimalplaces)來表示的運算結果準確到28個小數位十進制類型的取值范圍比double類型的范圍要小得多但它更精確當定義一個decimal變量并賦值給它時使用m下標以表明它是一個十進制類型如decimald_value=1.0m;如果省略了m在變量被賦值之前它將被編譯器當作雙精度double類型來處理4.1.4字符類型除了數字以外計算機處理的信息主要就是字符了字符包括數字字符英文字母表達符號等C#提供的字符類型按照國際上公認的標準采用Unicode字符集一個Unicode的標準字符長度為16位用它可以來表示世界上大多種語言可以按以下方法給一個字符變量賦值如charc='A';另外我們還可以直接通過十六進制轉義符前綴\x或Unicode表示法給字符型變量賦值前綴\u如下面對字符型變量的賦值寫法都是正確的charc='\x0032';//charc='\u0032';//注意在C和C++中字符型變量的值是該變量所代表的ASCII碼字符型變量的值作為整數的一部分可以對字符型變量使用整數進行賦值和運算而這在C#中是被禁止的和CC++中一樣在C#中仍然存在著轉義符用來在程序中指代特殊的控制字符表4-2轉義符EscapeSequences轉義符字符名\'單引號\"雙引號\\反斜杠\0空字符\a感嘆號Alert\b退格\f換頁\n新行\(zhòng)r回車\t水平tab\v垂直tab4.1.5結構類型利用上面介紹過的簡單類型我們在進行一些常用的數據運算文字處理似乎已經足夠了但是我們會經常碰到一些更為復雜的數據類型比如通訊錄的記錄中可以包含他人的姓名電話和地址如果按照簡單類型來管理每一條記錄都要存放到三個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論