1.1 關於C# C#只是一種簡單安全的新型面向對象語言,繼承了C的語法風格和C++的面向對象特性,不再提供對指針類型的支持(因此程式不可隨便訪問記憶體地址空間)、不再支持多重繼承; C#的誕生意義是生成面向.NET Framework環境的代碼,身為編程語言的一種,它作為開發工具而存在,本身並不是. ...
1.1 關於C#
C#只是一種簡單安全的新型面向對象語言,繼承了C的語法風格和C++的面向對象特性,不再提供對指針類型的支持(因此程式不可隨便訪問記憶體地址空間)、不再支持多重繼承;
C#的誕生意義是生成面向.NET Framework環境的代碼,身為編程語言的一種,它作為開發工具而存在,本身並不是.NET的一部分;
.NET Framework為C#提供了程式設計環境,CLR為C#程式語言提供了一個托管的運行時環境。
C#的特點:
1.簡潔
2.自由
3.繼承了C++的強大功能
4.強大的Web伺服器控制項
5.支持跨平臺
6.與XML(Extensible Markup Language, 可擴展標記語言,用於標記電子文件使其具有結構性)相融合
1.2 相關概念
1.2.1 .NET Framework平臺
一個集成的(integrated)、面向對象的(object-oriented)的開發平臺,以公共語言運行時/公共語言運行庫(Common Language Runtime, 簡稱CLR)為基礎,主要由CLR和.NET Framework基礎類庫(Base Class Library, 簡稱BCL)兩部分組成。C#語言及其編譯、運行依賴的主體。
補充:.NET Framework的定位與內部層級
.NET Framework介於操作系統和應用程式之間,負責管理運行在.NET Framework上的各種應用程式;
.NET應用程式並不依賴於操作系統,只依賴於.NET Framework;
底層是CLR,CLR的上層是基礎類庫BCL(主要作用就是為.NET程式開發提供常用類庫),在BCL的上一層是Windows窗體、ASP.NET等模塊(用於開發包括桌面應用程式、網路應用程式等在內的各種應用程式)。
1.2.2 CLR(Common Language Runtime)公共語言運行時、公共語言庫、.NET運行時
.NET Framework的執行環境,也是.NET Framework的核心;
主要負責管理.NET應用程式的編譯、運行以及一些基礎服務,為.NET應用程式提供了一個虛擬的運行環境;
同時還負責為應用程式提供記憶體分配、線程管理、垃圾回收等服務;
對代碼實施安全檢查(在CLR控制下運行的代碼-托管代碼Managed Code)相比較C/C++程式開發時需要手動管理、釋放記憶體,.NET Framework將這些操作自動化了,這就是.NET Framework的顯著優點,但自動化的同時也導致了性能的降低。
1.2.3 CTS(Common Type System)通用類型系統
.NET將各種不同編程語言的數據類型進行抽象誕生了CTS。不同的編程語言在.NET Framework上經過編譯後都轉換成了CTS類型,為不同語言的變數相互交換信息提供了保證,這就是.NET Framework支持混合語言編程的基本原理。
例如:Virsual Basic.NET定義的Integer數據類型 和 C#中定義的int類型,在 .NET Framework中都會被轉換成一樣的System.Int32數據類型。
1.2.4 CLS(Common Language Specification)公共語言規範
CTS的子集,.NET平臺上編寫的對象之間實現互相調用、語言的互操作性實現的前提;
CLS是一個最低標準集,所有面向.NET的編譯器都支持CLS;
CTS和CLS一起確保語言的互操作性。
1.2.5 CIL(Common Intermediate Language)通用中間語言,簡稱中間語言
C#程式第一次編譯後生成的托管代碼(Managed Code),與處理器的指令集很相似(指令集:處理器/CPU 中用來計算和控制電腦系統的一套指令的集合);
類似於不同編程語言中定義的數據類型在.NET Framework中都會被編譯為CTS類型,不同的編程語言在.NET Framework上都會被編譯為CIL;
CIL為.NET的語言互操作性提供了支持。
1.3 C#程式運行原理
C#程式運行主要分為兩個階段:編譯期和運行期,這兩個階段中各進行一次編譯
1.3.1 編譯期(第一次編譯)
由CLR中的C#編譯器對C#代碼進行編譯,輸出由CIL為內容語言形式的.dll文件或.exe文件
1.3.2 運行期(第二次編譯)
CLR針對目前特定的硬體環境通過編譯器(即時編譯器)將CIL即時編譯(JIT)為本機代碼並執行
編譯為本機代碼後的代碼會被自動存入緩衝區,下次使用相同代碼將直接從緩衝區中調用,因此相同的代碼只編譯一次,由此提高了程式運行的速度