注:本文大部分借鑒了《果殼中的C#5.0權威指南》,小編也想根據這本書好好梳理一下C#。
序言:C#是一種通用的類型安全且面向對象的編程語言。這種語言的目標是提高程序員的生產力,為此,需要在簡單性、可表達性和性能之間實現平衡。c#語言的首席架構師從第一個版本開始就是Anders Hejlsberg(Turbo Pascal的發明者和Delphi架構師)。C#語言與平台無關,但是他能夠很好的與Microsoft.NET Framework協同工作。
1.1 面向對象
C#實現了面向對象編程的廣泛特性,包括了(封裝、繼承、多態)。封裝表示在對象周圍創建一個邊界,將他的外部(公開)行為與內部(私有)實現細節隔離。
C#在面向對象方面的特性包括:
1、統一的類型系統
C#中的基礎構建塊是一種被稱為類型的數據與函數的封裝單元。C#有一個統一的類型系統,其中所有的類型最終共享一個公共的基類。這意味着所有的類型,不管他們是表示業務對象,還是數字等的基本類型,都共享相同的基本功能集。例如:任何類型都可以通過調用他的ToString方法轉換為一個字符串。
2、類與接口
在純粹的面向對象泛型中,唯一的類型就是類。但是C#中還有其他幾種類型,其中一種就是接口(類似Java中的接口)。接口與類相似,但是他只有某種類型的定義,而不是實現它。在需要使用多繼承時,他是非常有用的(與C++和Eiffel等語言不同,C#不支持類得多繼承(單根性))。
3、屬性、方法和事件
在純粹的面對象泛型中,所有的函數都是方法(smalltalk中就是這樣)。在C#中方法只是一種函數成員,也包含一些屬性和事件以及其他組成部分。屬性是封裝了一部分對象狀態的函數成員,如按鈕的顏色和標簽的文本。事件是簡化了對象狀態變化處理的函數成員。
1.2 類型安全性
C#首先是一種類型安全的語言,這意味着類型的只有通過他們的定義的協議進行交互,從而保證每一個類型內部一致性。例如:C#不允許將字符串類型作為整型處理。
更具體的說,C#支持靜態類型化,這意味着這種語言會在編譯時執行靜態類型安全性檢查的。另外一種是動態類型安全性,.NET CLR(CLR常用簡寫詞語,CLR是公共語言運行庫(Common Language Runtime)和Java虛擬機一樣也是一個運行時環境,它負責資源管理(內存分配和垃圾收集等),並保證應用和底層操作系統之間必要的分離。CLR存在兩種不同的翻譯名稱:公共語言運行庫和公共語言運行時。)在運行時執行動態安全性檢查。
靜態類型化能夠在程序之前除去大量的錯誤。他將大量的運行單元測試轉移到編譯器中,驗證程序中所以類型之間都是相互適合的。這樣大型程序就更容易管理、更具可預測性和健壯性。而且,靜態類型化是一些諸如:Visual Studio和IntelliSence等工具有助於編寫程序,因為他知道某個特定變量的類型是什么,因此也知道能夠調用哪些方法來處理這個變量。
注:C#允許部分代碼通過新的dynamic關鍵字來動態制定類型。然而,C#在大多數情況下是一種靜態類型化的語言。
C#之所以被稱為強類型語言,是因為他的類型規則(以靜態或動態的方法執行)是非常嚴格的。例如:不能夠使用一個浮點型參數來調用一個定義是接受的整數函數,除非顯示的將這個浮點型數轉換為整數。這又助於編碼錯誤。
強類型也是C#代碼能夠在沙箱運行的原因之一。沙箱的安全性的所用所有方面都由主機控制的一種環境。在沙箱中,一定注意不能隨意忽略一個對象的類型規則從而破壞其狀態。
1.3 平台支持
C#一般用來編寫運行在Windows平台的的代碼。雖然Microsoft通過ECMA(ECMAScript是一種由Ecma國際(前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association)通過ECMA-262標准化的腳本程序設計語言。這種語言在萬維網上應用廣泛,它往往被稱為JavaScript或JScript,但實際上后兩者是ECMA-262標准的實現和擴展。)實現了C#語言和CLR的標准化,但是專門用來支持非Windows平台C#資源(包括Microsoft的內部或者外部)總量相對較少。這意味着,如果很注重多平台支持,那么諸如Java等語言可能是更明智的選擇。因此,C#可以在以下情況用於編寫跨平台代碼:
1. C#代碼運行在服務器上,生成可運行在任意平台的DHTML。這正是ASP.NET采用的方法。
2. C#代碼運行在一個非Microsoft Common Language Runtime 的運行環境中。最典型的就是Mono項目,它具有自己的C#編譯器和運行時環境,可運行在Linux、Solaris、Mac OS X和Windows上。
3. C#代碼運行在一台支持Microsoft Silverlight(支持Windows和MAC OS X)的主機上。這是一種與Adobe Flash Player類似的新技術。
1.4 內存管理
C#依靠運行時環境來執行自動的內存管理。CLR有一個垃圾回收器,他是作為程序一部分運行的,負責回收不在被引用的對象所占用的內存。這讓程序員不需要顯示的釋放對象分配的內存,從而避免了諸如C++等語言中 錯誤使用指針造成的內存問題。C#並沒有去除指針:他只是使大多數編程任務不在需要指針。對於性能至關重要的熱點和互操作性方面,還是可以使用指針,但是之允許在顯示標記為不安全的代碼塊使用
1.5 C#與CLR的關系
c#依賴於一個運行環境,它包括許多特性,如自動管理內存和異常處理。C#的設計與CLR的設計非常接近,CLR提供了這些運行時特性(但c#技術不依賴於CLR)。而且C#的類型系統與CLR的類型系統非常接近(例如:都共享相同的基礎類型的定義)。
1.6 CLR和.NET Framework
.NET Framework 由名為Common Language Runtime(CLR)的運行時環境和大量程序庫組成的。這些程序庫由核心庫和應用庫組成,應用庫依賴於核心庫。下面就是這些程序庫的可視化概況:
CLR是執行托管代碼的運行環境。C#是幾種將源代碼編譯為托管代碼語言之一。托管代碼會被打包成程序集,他可以是.exe或者.dll(程序庫)的形式,包括了類型信息和元數據。
托管代碼用Intermediate Language 或者IL表示。當CLR加載一個程序集時,他將會將IL轉換為該主機的原生代碼,如X86.這個轉換是通過CLR的JT(JUST-IN-TIME)編譯器完成的。程序集幾乎保留了所有的源語言的解構,這使得他很容易被檢測,也很容易動態的生成代碼。
提示:Red Gate 的.NET Reflector是個重要分析程序集內容的工具(你可以將他看作為反編譯器使用)。
CLR是無數運行時的主機。這些服務包括了內存管理、程序加載和安全服務。CLR是與語言無關的。他允許開發人員使用多種語言(例如:C#、Visual Basic、.NET、Managed C++、Delp.NET、Chrome .NET和J#)開發應用程序。.NET Framework 只支持基礎所有Windows平台或Web的應用程序的程序庫組成。
1.7 C#與Windows Runtime
C#5.0還實現了Windows runtime(WinRT)庫的互操作。WinRT是一個可擴展接口和運行環境,他可以用面向對象和語言無關的方式訪問庫。win8帶有這個運行庫,屬於Microsoft組件對象模型或COM的擴展版本。(最低win8)
1.8 C#5.0新特性
C#5.0兩個較大的新特性是通過兩個關鍵字(async和await)支持異步功能。異步功能支持使用異步延續,從而可以簡化快速響應和線程安全客戶端應用程序編寫。他們還有利於編寫高度並發和高效I/O密集型應用程序,不需要為每一個操作綁定一個線程資源。