C# 語法學習_Lesson 2
型別與變數
C# 有兩種型別(Types): 實質型別(value type)及參考型別(reference type)
實質型別(value type)的變數本身就包含代入的資料。
參考型別(reference type)的變數僅是代入一個資料的參考連結,這個資料通常為一個物件(object)
在參考型別中,可允許兩個以上的變數參考同一個物件(object),因此對其中一個變數進行的操作可能會影響另一個變數所參考的物件。
而使用實質型別時,變數各自有自己的資料複本,因此在某一個變數上進行的操作,不會影響到其它的變數(ref及 out參數變數除外)
實值型別
簡單型別
1
2
3
4
5
61. 帶正負號的整數︰sbyte、short、int、long
2. 不帶正負號的整數︰byte、ushort、uint、ulong
3. Unicode 字元:char
4. IEEE 二進位浮點:float、double
5. 高精確度十進位浮點:decimal
6. 布林值:bool列舉型別
1
使用者定義型別,格式為 enum E {...}
結構型別
1
使用者定義型別,格式為 struct S {...}
可為Null的實值型別
1
含有 null 值的所有其他數值型別的擴充
參考型別
類別型別
1
2
31. 所有其他型別的基底類別︰object
2. Unicode 字串:string
3. 使用者定義型別,格式為 class C {...}介面型別
1
使用者定義型別,格式為 interface I {...}
陣列型別
1
單一維度和多維度,例如 int[] 和 int[,]
委派型別
1
使用者定義型別,格式為 delegate int D(...)
bool type(布林型別)的值為 true 或 false。
Character 和 string 在C#中是使用Unicode編碼,所以 char 型別為一個UTF-16編碼字元單位,而 string型別則為一串UTF-16編碼字元集。
C#的程式是使用型別宣告來建立新的class。 型別宣告會指定新型別的名稱(name)和成員(members)。
可由使用者定義的五種 C# 型別類型︰類別型別(class types)、結構型別(struct types)、介面型別(interface types)、列舉型別(enum types)及委派型別(delegate types)。
class 型別是定義一個資料結構,其中包含資料成員 (fields) 和函式成員 (method、properties及others)。 類別型別支援單一繼承和多型,因為這樣的機制,class是可以擴展沿伸(extend)及特製化。
struct 型別與class型別相似,它一樣具有資料成員和函式成員的結構。 不過,不同於類別,結構是實值型別,而且通常不需要堆積配置。 結構型別不支援使用者指定的繼承,且所有結構型別都隱含地繼承自 object 型別。
interface 型別將協定定義為一組具名的公用函式成員。 實作 interface 的 class 或 struct 必須提供介面的函式成員的實作。 interface 可以繼承自多個基底介面,class 或 struct可實作多個介面。
delegate 型別代表對方法的參考,其中含有特定參數清單與傳回型別。 委派讓您可將方法視為實體,而實體能指派給變數或當作參數來傳遞。 委派類似函式語言提供的函式型別。 它們也類似其他程式設計語言中的函式指標,但與函式指標的不同之處是,委派是物件導向且為型別安全。
class、struct、interface 和 delegate 類型全都支援泛型,因此它們可以使用其他類型來參數化。
enum 型別是具名型別中一個特別的型別。 每個 enum 型別必須是八種整數型別之一。 enum 型別的值組與基礎型別的值組相同。
C# 支持任何型別的一維及多維陣列。 不同於上述型別,陣列型別不需宣告即可使用。 而陣列型別的建構方法,是在型別名稱之後加上方括弧。 例如,int[] 是 int 的單一維度陣列、int[,] 是 int 的雙維陣列,而 int[][] 是 int 的單一維度陣列的單一維度陣列。
可為null的實值型別可不經宣告即可使用,針對每個不可為 Null 的實值型別 T,會有一個對應的可為 Null 實值型別 T?,其中可包含一個額外值 null。 比方說,int? 是可包含任一 32 位元整數或值 null 的型別。
C# 的型別系統是已整合的,任何型別值均可視為一個 object。 C# 中的每個型別都直接或間接衍生自 object 類別型別,而 object 是所有型別的基底類別。 參考型別的值之所以會視為物件,只是將這些值當作 object 型別來檢視。 數值型別的值之所以會視為物件,只是透過執行 boxing 和 unboxing 作業。 在下列範例中,int 值會轉換成 object,並再次轉換回 int。
1 | using System; |