Learning hard C#学习笔记 C#简介
第 1 章 你真的了解C#嗎
在正式介紹C#的語法和特性之前,讓我們首先來了解下它的發(fā)展歷程。因為只有知道了C#的概貌和由來,積累了必要的背景知識,我們才能更好地掌握C#,進而使用C#來編程。
1.1 什么是C#
C#(發(fā)音為C Sharp)是由微軟公司開發(fā)的一種面向?qū)ο笄疫\行于.NET Framework之上的高級程序設(shè)計語言。它的基本語法與C和C++類似,但相比較而言,C#更加簡單易學(xué)。如果你之前已經(jīng)對上述的任何一種語言有所了解,就可以通過學(xué)習(xí),在很短的時間里使用C#來編程。
C#還具有很多特性,例如封裝方法簽名的委托(類似于C++中的方法指針)、可為空的值類型、泛型方法和Lambda表達式等,這些特性都是其他語言所不具有的。C# 2.0支持泛型類型,從而避免了強制類型轉(zhuǎn)換帶來的性能損失;還提供了迭代器,因此可更簡單地為集合類型實現(xiàn)自定義的迭代行為。在C# 3.0中,語言集成查詢(LINQ)表達式使查詢操作更為簡單。C# 4.0中提供的動態(tài)類型,可以讓開發(fā)者為類型實現(xiàn)自定義的動態(tài)行為,從而使在C#這樣的靜態(tài)語言中調(diào)用諸如Python的動態(tài)語言成為可能。
使用C#開發(fā)應(yīng)用程序也比使用其他語言更簡單、快速,因為C#語言是基于.NET Framework的。.NET Framework為開發(fā)應(yīng)用程序提供了豐富的類庫和圖形控件,利用這些現(xiàn)有的控件就可以開發(fā)出一些應(yīng)用程序。而且,C#的開發(fā)工具Visual Studio也提供了很多應(yīng)用程序的模塊,我們可以利用模塊快速創(chuàng)建應(yīng)用程序。
1.1.1 C#語言的發(fā)展歷程
了解C#語言的發(fā)展歷程具有重要的意義,因為只有當(dāng)你知道了C#語言所具有的特性,才能更好地學(xué)習(xí)和掌握它們。
C#是微軟公司在2000年6月發(fā)布的全新編程語言。在其誕生后的14年里,為了幫助開發(fā)人員更好地使用C#語言來編寫應(yīng)用程序,微軟不斷地更新C#語言的版本,每次升級都能帶來讓我們眼前一亮的新特性。表1-1列出了C#每個版本中所更新的特性和對應(yīng)的.NET Framework版本。
表 1-1 C#各版本的新特性及對應(yīng)的.NET Framework版本
| C# 1.0 | .NET Framework 1.0 | Visual Studio .NET 2002 | 2002.1 | 委托事件 |
| C# 1.1 | .NET Framework 1.1 | Visual Studio .NET 2003 | 2003.4 | APM |
| C# 2.0 | .NET Framework 2.0 | Visual Studio 2005(開始命名為Visual Studio) | 2005.11 | 泛型 |
| C# 3.0 | .NET Framework 3.0 | Visual Studio 2008 | 2007.11 | 隱式類型的局部變量 |
| C# 4.0 | .NET Framework 4.0 | Visual Studio 2010 | 2010.4 | 動態(tài)綁定 |
| C# 5.0 | .NET Framework 4.5 | Visual Studio 2012 | 2012.8 | 異步和等待調(diào)用方信息 |
從表1-1可以看出,對于C#的每一個版本,微軟都是圍繞某個主題進行更新的,圖1-1更形象地總結(jié)了每個C#版本的主題。
圖 1-1
1.1.2 C#能編寫哪些應(yīng)用程序
對于讀者來說,最想達到的效果莫過于學(xué)完C#之后能立刻去開發(fā)應(yīng)用程序??梢赃@么說,只要掌握了C#,你就能編寫所看到的任何應(yīng)用程序了,比如音樂播放器、電子商務(wù)平臺,以及一些服務(wù)程序等。下面就介紹幾種常見的應(yīng)用程序類型。
1. Windows桌面應(yīng)用程序
用C#實現(xiàn)Windows桌面應(yīng)用程序較其他語言來說更為簡單快速。主要原因在于,Windows Forms模塊提供了一個強大的控件庫,其中包含按鈕、菜單等常用控件,用戶可使用這些控件,通過拖拉的方式輕松地建立Windows用戶界面。
另一方面,C#開發(fā)環(huán)境Visual Studio也很好地集成了Windows Forms模塊,方便我們創(chuàng)建這類應(yīng)用程序;而在.NET 3.0之后(對應(yīng)于Visual Studio 2008),我們還可以使用Windows Presentation Foundation(WPF)來實現(xiàn)Windows桌面應(yīng)用程序,WPF提供了更大的靈活性和更漂亮的外觀,如圖1-2所示。
圖 1-2
2. Web應(yīng)用程序
Web應(yīng)用程序就是一些Web頁面,通過瀏覽器可以查看這些Web頁面。.NET Framework提供了ASP.NET技術(shù)來幫助我們實現(xiàn)該類應(yīng)用程序。ASP.NET模塊中包含豐富的控件庫,我們可以利用這個控件庫來制作出漂亮的Web頁面。此外,Visual Studio也集成了該類應(yīng)用程序的模板(如圖1-3所示),使用模板來建立Web應(yīng)用程序速度更快。
圖 1-3
3. Web服務(wù)
Web服務(wù)是實現(xiàn)分布式應(yīng)用程序的一種方式。這里舉一個生活中的例子,幫助大家理解什么是服務(wù):我們?nèi)ワ埖瓿燥?#xff0c;就會有服務(wù)員來為我們服務(wù)點單??梢园l(fā)現(xiàn),服務(wù)即指我們不想自己去做,而希望別人幫助我們完成某件事情。
在開發(fā)過程中,我們也需要實現(xiàn)那些為其他應(yīng)用程序提供服務(wù)的程序,C#語言可以幫助我們實現(xiàn)這類應(yīng)用程序。在.NET Framework 3.0之后,微軟提供了Windows Communication Foundation(WCF)技術(shù)來實現(xiàn)Web服務(wù),Visual Studio中也集成了該應(yīng)用程序的模板(如圖1-4所示)。
圖 1-4
C#可以實現(xiàn)任何類型的應(yīng)用程序,上面只是簡單介紹了其中最常見的3類應(yīng)用程序。對于上面介紹的3種具體的技術(shù),本書不會多作介紹,請讀者朋友們參考相關(guān)圖書和資料進行學(xué)習(xí)。
1.2 什么是.NET Framework
在前面的介紹中,.NET Framework這個詞已經(jīng)出現(xiàn)過多次了,然而它到底是什么呢?
我們可以這樣去理解.NET Framework(.NET框架):C#是一門編程語言,它用于實現(xiàn)與計算機的對話,但C#編寫的程序是需要編譯和運行的,.NET Framework就是應(yīng)用程序運行時的執(zhí)行環(huán)境,為應(yīng)用程序的執(zhí)行提供以下幾種服務(wù)。
-
全面的類庫 .NET Framework提供了豐富的類庫以供調(diào)用,這使我們不必再去編寫大量代碼去處理常見的操作。
-
內(nèi)存管理 在許多其他的編程語言中,開發(fā)人員需要負責(zé)內(nèi)存的分配和釋放,以及對象生命周期的處理等任務(wù)。.NET Framework為了減輕開發(fā)人員的工作,提供了內(nèi)存管理服務(wù)。
-
通用類型系統(tǒng)(Common Type System,CTS) CTS定義了可以在中間語言中使用的預(yù)定義數(shù)據(jù)類型。
-
開發(fā)結(jié)構(gòu)和技術(shù) .NET Framework提供了開發(fā)特定應(yīng)用程序所需的庫,如Web應(yīng)用程序的ASP.NET技術(shù)。
-
語言互操作性 面向.NET Framework的語言編譯器都提供了生成中間語言代碼的機制,這種機制使得不同語言之間進行互操作成為可能。
1.2.1 .NET Framework的組成
前面簡單介紹了.NET Framework的概念,接下來,讓我們看看.NET Framework具體是由哪幾部分組成的。
.NET Framework包括公共語言運行時(Common Language Runtime,CLR)和.NET Framework類庫(Framework Class Library,FCL)。
1. 公共語言運行時
公共語言運行時是.NET Framework的核心基礎(chǔ)。我們可以將CLR看成一個在執(zhí)行時管理代碼的代理,它提供了內(nèi)存管理、線程管理和異常處理等服務(wù),而且還負責(zé)對代碼實施嚴格的類型安全檢查,保證了代碼的正確性。我們將受CLR管理的代碼稱為托管代碼(managed code),將不受CLR管理的代碼稱為非托管代碼(unmanaged code)。
CLR包含兩個組成部分:通用類型系統(tǒng)(Common Type System,CTS)和公共語言規(guī)范(Common Language Specification,CLS)。下面來具體了解這兩個組件的功能。
-
CTS
C#和VB.NET都是由CLR進行管理的,但是它們的語法和數(shù)據(jù)類型各不相同,CLR是如何對這兩種不同的語言進行托管的呢?
這得益于CTS。CTS用于解決不同語言之間數(shù)據(jù)類型不同的問題,如C#中整型是int,而VB.NET中的整型卻是Integer,通過CTS可以把這兩個類型變成通用類型Int32。所有.NET語言都共享CTS這一類型系統(tǒng),從而使它們之間能夠?qū)崿F(xiàn)無縫互操作。
CTS類型主要分為兩大類:引用類型和值類型。如圖1-5所示,這兩種類型之間存在著相互轉(zhuǎn)化,轉(zhuǎn)化方法分別為裝箱(box)和拆箱(unbox)。更多有關(guān)兩類CTS類型轉(zhuǎn)換的內(nèi)容將在第10章中介紹。
圖 1-5
-
CLS
.NET下的語言不僅僅存在數(shù)據(jù)類型的不同,語言規(guī)范上也有顯著的區(qū)別,公共語言規(guī)范(CLS)就是為了解決這個問題而誕生的。
CLS是一種最低的語言標準,它制定了以.NET平臺為目標的語言所必須支持的最小特征,以及某一語言與其他.NET語言之間實現(xiàn)互操作所需要的完備特征。凡是遵守這個標準的語言,在.NET框架下都可以實現(xiàn)互相調(diào)用;不符合公共語言規(guī)范的代碼就不能被其他語言調(diào)用,繼而不能與其他語言進行互操作。
比如在C#中,變量命名是區(qū)分大小寫的,而VB.NET卻不區(qū)分大小寫,這樣CLS就規(guī)定,編譯后的IL代碼除了大小寫之外必須還有其他的不同。圖1-6很好地演示了兩者之間的區(qū)別。
圖 1-6
2. .NET Framework
.NET Framework類庫就是一組DLL程序集的集合,其中包含了大量定義好的類型,這些類型都公開了一些功能。我們可以使用這些公開的功能開發(fā)出多種應(yīng)用程序,例如前面介紹的Windows Forms和ASP.NET應(yīng)用程序。
由于FCL中包含了數(shù)量極多的類型,因此有必要將相關(guān)的一組類型放到一個單獨的命名空間中加以區(qū)分,例如System.IO命名空間中就包含了用于執(zhí)行I/O操作的類型。因此,在使用FCL中某個類時,還必須知道該類所在的命名空間。
圖1-7可以幫助大家更好地理解公共語言運行時、類庫與應(yīng)用程序之間以及與整個操作系統(tǒng)之間的關(guān)系。
圖 1-7
1.2.2 C#與.NET Framework的關(guān)系
C#是面向.NET Framework的語言,除了C#之外,VB.NET和F#也都是面向.NET Framework的語言。.NET Framework為這些語言提供了執(zhí)行環(huán)境,這些語言則可以調(diào)用.NET Framework所提供的類庫來開發(fā)各種應(yīng)用程序。大家可以通過圖1-8更好地理解兩者之間的關(guān)系。
圖 1-8
1.2.3 C#代碼的執(zhí)行過程
在Visual Studio開發(fā)工具下,我們只需要按F5就可以編譯和執(zhí)行C#代碼了,但是C#代碼到底是如何執(zhí)行的呢?為了使C#代碼能夠運行,必須將其轉(zhuǎn)換為目標操作系統(tǒng)能夠理解的語言,即本機代碼(native code)。在.NET Framework平臺下,該過程包括兩個階段。
-
C#代碼編譯為中間語言代碼的階段——在編譯C#代碼時,并不是立即創(chuàng)建專用于操作系統(tǒng)的本機代碼,而是由C#編譯器(Visual Studio中集成了C#編譯器)把代碼編譯為通用中間語言(Common Intermediate Language,CIL)代碼。
-
中間語言代碼編譯為本機代碼的階段——要使C#代碼能夠運行,還需進一步將CIL代碼轉(zhuǎn)換為特定CPU的本機代碼,該過程由即時編譯器(Just-In-Time,JIT)來完成。
下面詳細介紹C#代碼的編譯和執(zhí)行過程。
1. C#代碼編譯為中間語言代碼階段
并不是只有C#代碼才能被編譯為中間語言代碼,其他面向.NET的語言(如VB .NET)在執(zhí)行之前也都需要先編譯為中間語言代碼。該過程由對應(yīng)的編譯器去完成,具體過程如圖1-9所示。
最終創(chuàng)建的IL代碼將存儲在一個程序集中,程序集中除IL代碼外,還將包括元數(shù)據(jù)和可選的資源文件。元數(shù)據(jù)用來描述代碼中的類型,這種描述針對3個方面:類型定義的描述、類型成員的描述和類型引用成員的描述??蛇x的資源文件指IL代碼中使用的其他數(shù)據(jù),如圖片文件等。
圖 1-9
程序集分為兩種:擴展名為.exe的可執(zhí)行文件,以及擴展名為.dll的可供其他程序調(diào)用的庫文件。
2. 中間語言代碼編譯為本機代碼階段
為了使IL代碼能夠運行,必須把它編譯為本機代碼,即CPU指令。這個過程由CLR的JIT編譯器來完成。其編譯過程如圖1-10所示。
圖 1-10
3. 執(zhí)行本機代碼
JIT編譯生成本機代碼之后,編譯好的本機代碼會被放置到一個緩沖區(qū)中緩存,下次再調(diào)用相同的代碼時,可直接運行緩沖區(qū)中現(xiàn)有的本機代碼,從而避免重新驗證IL代碼以及把它編譯為本機代碼的過程。使用這種方法,系統(tǒng)只在首次調(diào)用時才會造成一些性能損失(即發(fā)生JIT過程)。
1.3 歸納總結(jié)
本章簡單介紹了C#語言的特點和發(fā)展歷程,闡釋了.NET Framework與C#之間的關(guān)系,并給出了C#代碼的執(zhí)行過程。相信通過本章的學(xué)習(xí),你已經(jīng)對C#有了一個全面的認識。下一章將帶領(lǐng)大家創(chuàng)建一個簡單的控制臺程序。
?
from:?http://www.ituring.com.cn/book/tupubarticle/9043
總結(jié)
以上是生活随笔為你收集整理的Learning hard C#学习笔记 C#简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql截取字符串函数left和rig
- 下一篇: Learning hard C#学习笔记