C# 中的型別有兩種:值型別 (value type) 和引用型別 (reference type)。值型別的變數直接包含它們的資料,而引用型別的變數儲存對它們的資料的引用,後者稱為物件。對於引用型別,兩個變數可能引用同一個物件,因此對一個變數的操作可能影響另一個變數所引用的物件。對於值型別,每個變數都有它們自己的資料副本(除 ref 和 out 引數變數外),因此對一個變數的操作不可能影響另一個變數。

C# 的值型別進一步劃分為簡單型別 (simple type)、列舉型別 (enum type)、結構型別 (struct type) 和可以為 null 的型別 (nullable type),C# 的引用型別進一步劃分為類型別 (class type)、介面型別 (interface type)、陣列型別 (array type) 和委託型別 (delegate type)。

下表為 C# 型別系統的概述

八種整型型別分別支援 8 位、16 位、32 位和 64 位整數值的有符號和無符號的形式。

兩種浮點型別:float 和 double,分別使用 32 位單精度和 64 位雙精度的 IEEE 754 格式表示。

decimal 型別是 128 位的資料型別,適合用於財務計算和貨幣計算。

C# 的 bool 型別用於表示值為 true 或 false 的布林值。

在 C# 中,字元和字串處理使用 Unicode 編碼。char 型別表示一個 UTF-16 編碼單元,string 型別表示 UTF-16 編碼單元的序列。

下表總結了 C# 的數值型別。

C# 程式使用型別宣告 (type declaration) 建立新型別。型別宣告指定新型別的名稱和成員。在 C# 型別分類中,有五類是使用者可定義的:類型別 (class type)、結構型別 (struct type)、介面型別 (interface type)、列舉型別 (enum type) 和委託型別 (delegate type)。

類型別定義了一個包含資料成員(欄位)和函式成員(方法、屬性等)的資料結構。類型別支援單一繼承和多型,這些是派生類可用來擴充套件和專用化基類的機制。

結構型別與類型別相似,表示一個帶有資料成員和函式成員的結構。但是,與類不同,結構是一種值型別,並且不需要堆分配。結構型別不支援使用者指定的繼承,並且所有結構型別都隱式地從型別 object 繼承。

介面型別定義了一個協定,作為一個公共函式成員的命名集。實現某個介面的類或結構必須提供該介面的函式成員的實現。一個介面可以從多個基介面繼承,而一個類或結構可以實現多個介面。

委託型別表示對具有特定引數列表和返回型別的方法的引用。通過委託,我們能夠將方法作為實體賦值給變數和作為引數傳遞。委託類似於在其他某些語言中的函式指標的概念,但是與函式指標不同,委託是面向物件的,並且是型別安全的。

類型別、結構型別、介面型別和委託型別都支援泛型,因此可以通過其他型別將其引數化。

列舉型別是具有命名常量的獨特的型別。每種列舉型別都具有一個基礎型別,該基礎型別必須是八種整型之一。列舉型別的值集和它的基礎型別的值集相同。

C# 支援由任何型別組成的一維和多維陣列。與以上列出的型別不同,陣列型別不必宣告就可以使用。實際上,陣列型別是通過在某個型別名後加一對方括號來構造的。例如,int[] 是一維 int 陣列,int[,] 是二維 int 陣列,int[][] 是一維 int 陣列的一維陣列。

可以為 null 的型別也不必宣告就可以使用。對於每個不可以為 null 的值型別 T,都有一個相應的可以為 null 的型別 T?,該型別可以容納附加值 null。例如,int? 型別可以容納任何 32 位整數或 null 值。

C# 的型別系統是統一的,因此任何型別的值都可以按物件處理。C# 中的每個型別直接或間接地從 object 類型別派生,而 object 是所有型別的最終基類。引用型別的值都被視為 object 型別,被簡單

地當作物件來處理。值型別的值則通過對其執行裝箱和拆箱操作按物件處理。下面的示例將 int 值轉換為 object,然後又轉換回 int。

using System;

class Test
{
static void Main() {
     int i = 123;
     object o = i;        // Boxing
     int j = (int)o;      // Unboxing
}
}

當將值型別的值轉換為型別 object 時,將分配一個物件例項(也稱為“箱子”)以包含該值,並將值複製到該箱子中。反過來,當將一個 object 引用強制轉換為值型別時,將檢查所引用的物件是否含有正確的值型別,如果有,則將箱子中的值複製出來。

C# 的統一型別系統實際上意味著值型別可以“按需”轉換為物件。因為統一,所以使用型別 object 的通用庫可以與引用型別和值型別一同使用。

C# 中存在幾種變數 (variable),包括欄位、陣列元素、區域性變數和引數。變量表示了儲存位置,並且每個變數都有一個型別,以決定什麼樣的值能夠存入變數,如下表所示。