一、C#與.NET的關系
C#本身是一門語言,他是用於生成面向.NET環境的代碼,但其並不是.NET的一部分。換言之,C#編寫 的代碼總是運行在.NET Framework中。而且,在很多時候,C#的特定功能依賴於.NET。比如,在C#中聲 明一個int類型,實際上是.NET中System.Int32類的一個實例。
.NET的核心是CLR(公共語言運行時)。在CLR中運行的代碼,我們成為“托管代碼”。
我們寫的代碼在運行之前,會經過兩個編譯階段。
1、把源代碼編譯為IL(Microsoft中間語言)
2、CLR把IL編譯為平台專用的代碼。
在這裡,我們來簡單說說“托管代碼”。
IL和Java的字節代碼的理念基本是一樣的,都是一種低級語言,都用數字表示,可以非常快速度的轉 化為機器代碼,這樣執行效率會高很多,同時這也就是我們經常說的“平台無關性”的實現很 重要的一個環節。VB.NET C# J# 的源碼都可以被編譯成相同的IL, 也就實現了平台無關。換言之,只 要.NET Framework 可以運行在任何設備或系統上,VB.NET C# J#編寫的代碼都可以運行,而且都可以運 行在任何設備或者系統上。
VB.NET C# J# 的源碼都可以被編譯成相同的IL,這樣不同語言編寫的不同類都可以很容易的相互操作 ,也就是所說的,語言的互操作性。
似乎這個IL(Microsoft 中間語言)很好很強大,很神很奇特。我們接下來了解下這個IL。
首先,簡要的說說它的主要特征:
A、面向對象和使用接口
B、值類型和引用類型之間的巨大差別
C、強數據類型
D、使用異常來處理錯誤。
E、使用屬性(attribute)
接下來具體說說這些特征。
(一)、面向對象和使用接口
面向對象,在此不做多的闡述了。主要在這裡說說接口。關於接口,有一個很重要的理念:提供一個 契約,實現給定接口的類,必須提供該接口的所有方法和屬性的實現。舉個例子說明吧,有個接口IUser ,其有age,sex,userName屬性,有 setUname(),getAge()方法。有個類,UserClass繼承自IUser。這時, UserClass就必須實現IUser的所有方法setUname(),getAge()和所有屬性 age,sex,userName。
(二)、值類型和引用類型的巨大差異。
對於值類型,變量直接保存其數據,而對於引用類型,變量僅僅保存數據的地址。值類型一般存儲在 堆棧中,引用類型一般存儲在托管堆中。
(三)、強數據類型
所謂強數據類型,是指所有的變量都明確的被標記為某個特定的數據類型。比如string 或者int 等。 IL不允許對模糊數據類型執行操作。在javascript中的 var 變量就是模糊類型數據。
不過在現在的,.NET 3.5 中也加入了var ,也就是模糊數據類型。
(四)、使用異常來處理錯誤。
C#中以 try{} catch{}finally{}代碼塊來處理。這個具體在後面再談。
(五)、屬性的使用。
用戶定義的Attribute和其對應的數據類型或方法的元數據放在一起,這對於文檔說明很有用,它們和 反射技術一起使用,執行特定的任務。
在這裡提及到的元數據以及反射,在後面我們將會詳細講述到。