CTS(Common Type System)

CTS表述了一個類別的定義和行為。既然CTS是一組規範,那麼都規定了什麼呢?

一、CTS規定一個類別可以包含零個或多個成員(欄位、屬性、方法、事件) 二、CTS規定了一個類別的存取層級。就是我們所說的存取修飾詞(public、private、protected、internal) 三、CTS規定任何類別都必須繼承自System.Object等等

CLS(Common Language Specification)

CLS是一個各個語言間都支持的功能。也就是說,CLS是CTS的一個子集,而這個子集是.NET框架下面所有程式語言都必須遵守的。更詳細一點就是說,如果你想用C#調用C++的組件,那麼C++所使用的語法,必須保證C#能夠操作。可是C++程序員不一定知道C#能不能操作他所寫的方法,這個時候就需要CLS進行約束,以保證C#能正常的調用C++的組件。 為了使各種語言能互通,所以需要CLS規範,所有運行再CLR上面的語言必須支持CLS。 例如CLS有Int16但沒有要求UInt64(CTS都有),所以運行再CLR上面的必須支持Int16,但不必須支持UInt64。這就告訴我們設計的類別庫要讓所有支持CLR的語言使用就必須以CLS的規範公開接口,內部可以使用CTS的規範

CLR(Common Language Runtime)

CLR是.NET Framework的核心,用來管理程式碼的運作。

主要功能如下 基礎類別庫支援 Base Class Libray Support 記憶體管理 Memory Management 執行緒管理 Thread Management 記憶體自動回收 Garbage Collection 安全性 Security 型別檢查 Type Checker 例外管理 Exception Manager 除錯管理 Debug Engine 中間碼(MSIL)到機器碼(Native)編譯 型別裝載 Class Loader

型別轉換

  • 隱含轉換:不必使用特殊語法,因為這類轉換屬於型別安全轉換,而且不會遺失資料。這類範例包括從小型到大型整數型別的轉換,以及從衍生類別 (Derived Class) 到基底類別 (Base Class) 的轉換。
  • 明確轉換 (轉型):明確轉換需要使用轉型運算子。來源與目的變數相容,但可能會遺失資料,因為目的變數的型別大小會小於來源變數 (或是基底類別的來源變數)。
    ```cs 隱含轉換

static void Main() { int num = 2147483647; object bigNum = num; }

明確轉換

static void Main() { double x = 1234.7; object a; a = (int)x; } ```

Boxing

Boxing 可用來儲存記憶體回收堆積中的實值型別。 Boxing 是一種隱含轉換,可將實值型別轉換成 object 型別,或是任何由這個實值型別實作的介面型別。 對實值型別進行 Boxing 作業時,會在堆積上配置物件執行個體,並將值複製至新物件中。

Unboxing

Unboxing 處理是將 object 型別明確轉換成實值型別,或從介面型別明確轉換成實作介面的實值型別。 Unboxing 作業包含: 檢查物件執行個體以確定這是指定之實值型別的 boxed 值 將執行個體的值複製到實值型別變數

比較 int.Parse、int.TryParse、Convert.ToInt32、(int)

int.Parse 當轉換的值太大或太小、Empty、null、非整數 => 拋出異常。

int.TryParse 當轉換的值太大或太小、Empty、null、非整數 => 回傳 False。

Convert.ToInt32 當轉換的值太大或太小、Empty、非整數 => 拋出異常。 當轉換的值為 null => 回傳 0。

(int) 只能用其他數字類型轉換,例如int、long、double

進制轉換

10進制轉2、8、16進制

int i = 325;
Convert.ToString(i, 2)    // 101000101
Convert.ToString(i, 8)    // 505
Convert.ToString(i, 16)    // 145

2、8、16進制轉10進制

Convert.ToInt32("101000101", 2)        // 325
Convert.ToInt32("505", 8)            // 325
Convert.ToInt32("145", 16)            // 325