C# 有兩種類型:值類型和引用類型忿磅。
值類型的變量直接包含數(shù)據(jù)另患,而引用類型的變量則存儲對數(shù)據(jù)(稱為“對象”)的引用囊陡。
借助引用類型芳绩,兩個變量可以引用同一對象;因此撞反,對一個變量執(zhí)行的運算可能會影響另一個變量引用的對象妥色。 借助值類型,每個變量都有自己的數(shù)據(jù)副本遏片;因此嘹害,對一個變量執(zhí)行的運算不會影響另一個變量(ref 和 out 參數(shù)變量除外)。
C# 值類型又細分為簡單類型吮便、枚舉類型笔呀、結構類型和可以為 null 的值類型。
C# 引用類型又細分為類類型髓需、接口類型许师、數(shù)組類型和委托類型。
下面概述了 C# 的類型系統(tǒng)僚匆。
值類型
簡單類型
有符號的整型:sbyte微渠、short、int咧擂、long
無符號的整型:byte敛助、ushort、uint屋确、ulong
Unicode 字符:char
IEEE 浮點:float纳击、double
高精度小數(shù):decimal
布爾:bool
枚舉類型
格式為 enum E {...} 的用戶定義類型
結構類型
格式為 struct S {...} 的用戶定義類型
可以為 null 的值類型
值為 null 的其他所有值類型的擴展
引用類型
類類型
其他所有類型的最終基類:object
Unicode 字符串:string
格式為 class C {...} 的用戶定義類型
接口類型
格式為 interface I {...} 的用戶定義類型
數(shù)組類型
一維和多維,例如 int[] 和 int[,]
委托類型
格式為 delegate int D(...) 的用戶定義類型
八個整型類型支持帶符號或不帶符號格式的 8 位攻臀、16 位焕数、32 位和 64 位值。
兩個浮點類型(float 和 double)分別使用 32 位單精度和 64 位雙精度 IEC-60559 格式表示刨啸。
decimal 類型是適用于財務和貨幣計算的 128 位數(shù)據(jù)類型堡赔。
C# 的 bool 類型用于表示布爾值(true 或 false)。
C# 使用 Unicode 編碼處理字符和字符串设联。 char 類型表示 UTF-16 代碼單元善已,string 類型表示一系列 UTF-16 代碼單元灼捂。
下面總結了 C# 的數(shù)值類型。
有符號的整型
sbyte:8 位换团,介于 -128 到 127 之間
short:16 位悉稠,介于 -32,768 到 32,767 之間
int:32 位,介于 -2,147,483,648 到 2,147,483,647 之間
long:64 位艘包,介于 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 之間
無符號的整型
byte:8 位的猛,介于 0 到 255 之間
ushort:16 位,介于 0 到 65,535 之間
uint:32 位想虎,介于 0 到 4,294,967,295 之間
ulong:64 位卦尊,介于 0 到 18,446,744,073,709,551,615 之間
浮點
float:32 位,介于 1.5 × 10-45 到 3.4 × 1038 之間舌厨,7 位精度
double:64 位岂却,介于 5.0 × 10-324 到 1.7 × 10308 之間,15 位精度
Decimal
decimal:128 位裙椭,至少介于 -7.9 × 10-28 到 7.9 × 1028 之間淌友,至少為 28 位精度
C# 程序使用類型聲明創(chuàng)建新類型。 類型聲明指定新類型的名稱和成員骇陈。
用戶可定義以下五種 C# 類型:類類型、結構類型瑰抵、接口類型你雌、枚舉類型和委托類型。
class 類型定義包含數(shù)據(jù)成員(字段)和函數(shù)成員(方法二汛、屬性及其他)的數(shù)據(jù)結構婿崭。 類類型支持單一繼承和多形性,即派生類可以擴展和專門針對基類的機制肴颊。
struct 類型定義包含數(shù)據(jù)成員和函數(shù)成員的結構氓栈,這一點與類類型相似。 不過婿着,與類不同的是授瘦,結構是值類型,通常不需要進行堆分配竟宋。 結構類型不支持用戶指定的繼承提完,并且所有結構類型均隱式繼承自類型 object。
interface 類型將協(xié)定定義為一組已命名的公共函數(shù)成員丘侠。 實現(xiàn) interface 的 class 或 struct 必須提供接口函數(shù)成員的實現(xiàn)代碼徒欣。 interface 可以繼承自多個基接口,class 和 struct 可以實現(xiàn)多個接口蜗字。
delegate 類型表示引用包含特定參數(shù)列表和返回類型的方法打肝。 通過委托脂新,可以將方法視為可分配給變量并可作為參數(shù)傳遞的實體。 委托類同于函數(shù)式語言提供的函數(shù)類型粗梭。 委托也類似于其他一些語言中的函數(shù)指針概念争便,但與函數(shù)指針不同的是,委托不僅面向對象楼吃,還類型安全始花。
class、struct孩锡、interface 和 delegate 類型全部都支持泛型酷宵,因此可以使用其他類型對它們進行參數(shù)化。
enum 類型是一種包含已命名常量的獨特類型躬窜。 每個 enum 類型都有一個基礎類型(必須是八種整型類型之一)浇垦。 enum 類型的值集與基礎類型的值集相同。
C# 支持任意類型的一維和多維數(shù)組荣挨。
與上述類型不同男韧,數(shù)組類型無需先聲明即可使用。 相反默垄,數(shù)組類型是通過在類型名稱后面添加方括號構造而成此虑。
例如,
int[] 是 int 類型的一維數(shù)組口锭,
int[,] 是 int 類型的二維數(shù)組朦前,
int[][] 是由 int 類型的一維數(shù)組構成的一維數(shù)組。
可以為 null 的值類型也無需先聲明即可使用鹃操。 對于所有不可以為 null 的值類型 T韭寸,都有對應的可以為 null 的值類型 T?,后者可以包含附加值 null荆隘。 例如恩伺,int? 是可以包含任何 32 位整數(shù)或值 null 的類型。
C# 采用統(tǒng)一的類型系統(tǒng)椰拒,因此任意類型的值都可視為 object晶渠。
每種 C# 類型都直接或間接地派生自 object 類類型,而 object 是所有類型的最終基類燃观。 只需將值視為類型 object乱陡,即可將引用類型的值視為對象。 通過執(zhí)行裝箱和取消裝箱操作仪壮,可以將值類型的值視為對象憨颠。 在以下示例中,int 值被轉換成 object,然后又恢復成 int爽彤。
using System;
class BoxingExample
{
static void Main()
{
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
}
}
當值類型的值轉換成 object 類型時养盗,將分配 object 實例(亦稱為“箱”)來包含值,然后該值會復制到相應的箱中适篙。 相反往核,當 object 引用被顯式轉換成值類型時,將檢查引用的 object 是否是具有正確值類型的箱嚷节;如果檢查成功聂儒,則會將箱中的值復制出來。
C# 的統(tǒng)一類型系統(tǒng)實際上意味著可以“按需”將值類型轉換成對象硫痰。 鑒于這種統(tǒng)一性衩婚,使用類型 object 的常規(guī)用途庫可以與引用類型和值類型結合使用。
C# 有多種變量效斑,其中包括字段非春、數(shù)組元素、局部變量和參數(shù)缓屠。 變量表示存儲位置奇昙,每個變量都具有一種類型,用于確定可以在變量中存儲哪些值敌完,如下文所述储耐。
不可以為 null 的值類型
具有精確類型的值
可以為 null 的值類型
null 值或具有精確類型的值
object
null 引用、對任意引用類型的對象的引用滨溉,或對任意值類型的裝箱值的引用
類類型
null 引用什湘、對類類型實例的引用,或對派生自類類型的類實例的引用
接口類型
null 引用业踏、對實現(xiàn)接口類型的類類型實例的引用,或對實現(xiàn)接口類型的值類型的裝箱值的引用
數(shù)組類型
null 引用涧卵、對數(shù)組類型實例的引用勤家,或對兼容的數(shù)組類型實例的引用
委托類型
null 引用或對兼容的委托類型實例的引用