一直對.Net架構迷迷糊糊的,今天看到這一章,終於幫我理清了思路。
第一、.Net架構應理解為代碼的執行環境:一方面它管理代碼的執行過程,另一方面它為代碼提供類庫支援。
通用語言執行平台(CLR)則是管理代碼的執行過程。它負責運行代碼、確保代碼的安全性和準確性;並負責管理記憶體、線程調度等核心任務。通常我們把在CLR控制下的啟動並執行代碼稱為Managed 程式碼。
.Net 架構基礎類庫(FCL)則是代碼的類庫支援者。
第二、C#和.Net的關係
C#原始碼——編譯——微軟中繼語言(MSIL)——經過JIT(即時編譯)——機器語言。
JIT提高效能:因為JIT編譯是在程式運行時發生。
MSIL為語言的互操作行提供了可能:因為不同語言編寫的組件最終都編譯為中繼語言,然後組成一個完整的程式。
msil理論上可以運行在任何安裝了.net架構的作業系統上。
第三、CTS一般型別系統和Common Language Specification(CLS)
以前一直搞不清為什麼C#用Int和Int32表示同一種類型,現在終於明白了。INT32等是MSIL語言的類型——CTS類型——一般型別系統的標準的基礎資料型別 (Elementary Data Type),只是在不同語言中有不同的表示方法。如C#裡是INT,C++裡是(sign)int.也就是說不管是C#的int還是C++的(sign)int最終都編譯成MSIL的INT32類型。
一般型別系統不但指定了基本的資料類型,還定義了一個內容豐富的類型階層。
CLS是所有.NET語言都支援的語言規範。也就是說Common Language Specification中的文法規則在所有.NET語言中都成立,它是所有.NET語言都支援的文法規則的交集。從而,符合CLS規範的代碼轉換為中繼語言後能被.NET上任何語言訪問,從而確保不同語言的互操作行。當然,編寫不符合CLS規範的代碼也是可以的,但是不能保證不同語言的互通性。
類型的判定:
sizeof:擷取資料類型在記憶體中的位元組數。但不能擷取自己定義的類的資料類型的位元組數。
typeof:擷取資料類型的CTS類型名,故起參數只能是類型。也就是編譯成中繼語言後的類型。自己定義的類型也可以擷取。
GetType:擷取某個變數的類型。
is運算子:檢驗某個對象是否是某種類型。有點與GetType類似,但是當對象和類型之間是繼承關係式,is運算子仍然會返回TRUE。
命名空間:命名空間是用來組織類的,避免兩個類庫的重名。
裝箱、拆箱:
實值型別——參考型別:裝箱(隱藏)
參考型別——實值型別:拆箱(顯示轉換)
對象的相等:
ReferenceEquals()和Equals()和相等運算子(==):
ReferenceEquals()和Equals()預設情況均比較引用符,但是我們可以對Equals()進行重寫,使之比較實值型別;
相等運算子(==):預設情況下,若兩個對象為實值型別,則比較值;若兩個對象為參考型別,則比較引用符。但是我們可以用重載運算子的方法加以改變。