一般型別系統概觀
更新:2007 年 11 月
本節中所描述的概念和定義的詞彙將可幫助您暸解和使用語言的一般型別系統實作。
型別分類
一般型別系統可支援兩個一般類別的型別,每一個類別又可細分為多個子類別:
實值型別
實值型別直接包含資料,而且實值型別的執行個體 (Instance) 不是在堆疊上配置,就是在結構中內嵌 (Inline) 配置。實值型別可為內建 (由執行階段實作)、使用者定義或列舉型別 (Enumeration)。如需內建實值型別的清單,請參閱 .NET Framework 類別庫。
參考型別
參考型別 (Reference Type) 會儲存變數記憶體位址的參考,並且在堆積 (Heap) 上配置。參考型別可為自我描述型別、指標型別 (Pointer Type) 或介面型別 (Interface Type)。參考型別的型別可從自我描述型別的值判斷出來。自我描述型別可再分為陣列和類別型別。類別型別包括使用者定義型別、Boxed 實值型別和委派。
實值型別的變數都各擁有自己的資料複本,因此對其中一個變數進行的作業並不會影響其他變數。參考型別的變數可參考相同的物件,因此對其中一個變數進行的作業可能會影響其他變數所參考的相同物件。
所有型別都是衍生自 System.Object 基底型別。
下列範例顯示參考型別和實值型別之間的差異。
Class Class1
Public Value As Integer = 0
End Class 'Class1
Class Test
Shared Sub Main()
Dim val1 As Integer = 0
Dim val2 As Integer = val1
val2 = 123
Dim ref1 As New Class1()
Dim ref2 As Class1 = ref1
ref2.Value = 123
Console.WriteLine("Values: {0}, {1}", val1, val2)
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
End Sub 'Main
End Class 'Test
using System;
class Class1
{
public int Value = 0;
}
class Test
{
static void Main() {
int val1 = 0;
int val2 = val1;
val2 = 123;
Class1 ref1 = new Class1();
Class1 ref2 = ref1;
ref2.Value = 123;
Console.WriteLine("Values: {0}, {1}", val1, val2);
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
}
}
這個程式的輸出如下。
Values: 0, 123
Refs: 123, 123
下圖將說明這些不同型別之間的關係。請注意,即使這些型別包含子類別,型別的執行個體也可以只是實值型別或自我描述型別。
型別分類
如需每一個型別的詳細資訊,請參閱:實值型別、列舉型別、類別、委派、陣列、介面和指標。
數值和物件
數值是資料的二進位表示,而型別則提供暸解譯這個資料的方式。實值型別直接儲存為型別資料的二進位表示。參考型別的值是代表型別資料的位元序列位置。
每一個數值都有一個型別剛好可完整定義數值的表示,以及在數值上定義的作業。自我描述型別的值稱為物件。雖然只要檢查物件的值就可以判斷出物件的真正型別,但是對於實值型別或指標型別則沒有用。一個數值可具有多個型別。實作介面的型別值也是該介面型別的值。同樣地,從基底型別衍生而來的型別值也就是該基底型別的值。
型別和組件
Runtime 使用組件 (Assembly) 來尋找和載入型別。組件資訊清單 (Assembly Manifest) 包含 Runtime 用來解析組件範圍內所有型別參考的資訊。
Runtime 中的型別名稱有兩個邏輯部分:組件名稱和組件內的型別名稱。名稱相同但位於不同組件中的兩個型別依照定義為兩個不同的型別。
組件在開發人員所看見的名稱範圍與 Runtime 系統所看見的名稱範圍之間提供了一致性。開發人員會在組件的內容中撰寫型別。開發人員正在建置的組件內容會建立名稱範圍,該名稱範圍將可在執行階段中使用。
型別和命名空間
從 Runtime 的觀點來看,命名空間 (Namespace) 只是型別名稱的集合。某些語言可能會具有建構和對應的語法,可幫助開發人員建立型別的邏輯群組,但是 Runtime 在繫結型別時並不會使用這些建構。因此,Object 和 String 類別都是 System 命名空間的一部分,但執行階段僅識別每個型別的完整名稱,分別為 System.Object 和 System.String。
您可以建置單一組件,公開看起來像是不同階層式命名空間中的型別,例如 System.Collections 和 System.Windows.Forms。也可以建置兩個組件,同時匯出名稱包含 MyDll.MyClass 的型別。
如果您建立工具,將組件中的型別表示成屬於階層式命名空間,工具必須列舉組件或組件群組中的型別,並剖析型別名稱以衍生出階層關聯性。