
C# 語言的類型分為兩大類:值類型(value type)和引用類型(reference type),而它們又都同時具有至少一個類型形參的泛型類型(generic type)。類型形參(type parameters)能同時指定值類型和引用類型。

第三類是指針(pointers),只能用于非安全代碼(unsafe code)中。關于非安全代碼,將在第十八章第二節內討論。
值類型與引用類型不同之處在于值類型的變量直接包含其數據,而引用類型的變量保存對其數據的引用(references),后者被稱為對象(objects)。對于引用類型,可能兩個變量能引用同一個對象,也可能因操作一個變量所引用的對象而影響到其它變量。對于值類型,每個變量都擁其數據之副本,不會因操作其一而影響其它。
C# 的類型系統擁有統一標準,任何類型的值都能被當做對象來處理(a value of any type can be treated as an object)。C# 中每種類型都直接或間接派生自 object 類類型,object 是所有類型的最終基類(ultimate base class)。引用類型的值都被視為 object 類型故被簡單當做對象來處理。值類型的值通過裝箱與拆箱操作來實現類型處理(第四章第三節)。
值類型(value type)可以是一個結構類型(struct type),也可以是一個枚舉類型(enumeration type)。C# 提供了一組預定義的結構類型,稱作簡單類型(simple types)。簡單類型通過保留字(reserved Words)[1]標識(identified)。

與引用類型的變量不同,值類型的變量只有在類型是可空類型(nullable type)時才可以包含空值(null)。每一個非可空值類型(non-nullable value type)都有一個對應的可空值類型,它們具有相同的值集(只是額外再加上一個 null 值)。
對值類型變量的賦值會在賦值過程中創建一個值的副本。這與對一個引用類型變量賦值不同,引用類型只拷貝引用,而不是引用標識的對象。
所有值類型均隱式繼承自 System.ValueType 類,后者又繼承自 object 類。不可能對值類型進行派生,值類型都隱式密封(implicitly sealed,第十章第 1.1.2 節)的。
注意,System.ValueType 自身并不是值類型(value-type)。確切地講,它是一個類類型(class-type),所有的值類型(value-type)都自動派生自它。
所有值類型均隱式聲明了一個公共無參實例構造函數(public parameterless instance constructor),稱作默認構造函數(default constructor)。默認構造函數返回一個零初始化實例(zero-initialized instance),它就是值類型的默認值(default value):
0;'/x0000';0.0f;0.0d;0.0m;false。E 來說,默認值為 0,該值被轉換為類型 E;HasValue 為 false 且屬性 value 未定義的(undefined)的實例。默認值也可以叫做可空值類型的 null 值(null value)。和其它實例構造函數一樣,值類型的默認構造函數也通過 new 操作符來調用。出于效率的緣故,實際上我們不必去執行調用它的構造函數。在下例中,變量 i 和 j 都會初始化為零(zero)。
class A{ void F() { int i = 0; int j = new int(); }}因為每個值類型都隱式擁有一個公開無參實例構造函數,所以結構類型中不可以顯式包含一個無參構造函數的聲明,但允許結構類型聲明參數化實例構造函數(parameterized instance constructors,第十一章第 3.8 節)。
結構類型(struct type)是能聲明常量、字段、方法、屬性、索引器、操作符、實例構造函數、靜態構造函數和嵌套類型的值類型。構造類型的聲明在第十一章第一節中有描述。
C# 提供了一組預定義的結構類型,稱作簡單類型(simple type)。簡單類型通過保留字進行識別,但這些保留字也只是簡單地為預定義于 System 命名空間內的結構類型提供了別名,如下表所示:
| 保留字 | 別名對應的類型 |
|---|---|
| sbyte | System.SByte |
| byte | System.Byte |
| short | System.Int16 |
| ushort | System.UInt16 |
| int | System.Int32 |
| uint | System.UInt32 |
| long | System.Int64 |
| ulong | System.UInt64 |
| char | System.Char |
| float | System.Single |
| double | System.Double |
| bool | System.Boolean |
| decimal | System.Decimal |
由于簡單類型是結構類型的別名,故每一個簡單類型都有成員。比方說 int 有聲明于 System.Int32 內的成員以及繼承自 System.Object 的成員,下面這些語句是合法的:
int i = int.MaxValue; // System.Int32.MaxValue 常量string s = i.ToString(); // System.Int32.ToString() 實例方法string t = 123.ToString(); // System.Int32.ToString() 實例方法簡單類型與其它結構類型不同之處在于它們允許某些額外的操作:
123 是 int 類型的字面值,'a' 則是一個字符的字面值。C# 總體來說不對結構類型的字面值做過多規定,因此其它結構類型的非默認值(non-default values)總是通過這些結構類型的實例構造函數來創建。const 聲明可在簡單類型內聲明一個常量(第十章第四節)。常量不可屬于其它結構類型,但可使用靜態只讀字段(static readonly fields)達到相似目的。C# 支持九中整數類型(integral type):sbyte, byte, short, ushort, int, uint, long, ulong 以及 char。整數類型值的尺寸與范圍如下:
sbyte 類型表示有符號(signed)的 8 位(8-bit)整數,區間為 -128 到 127;byte 類型表示無符號(unsigned)的 8 位(8-bit)整數,區間為 0 到 255;short 類型表示有符號的 16 位(16-bit)整數,區間為 -32768 到 32767;ushort 類型表示無符號的 16 位(16-bit)整數,區間為 0 到 65535;int 類型表示有符號的 32 位(32-bit)整數,區間為 -2147483648 到 2147483647;uint 類型表示無符號的 32 位(32-bit)整數,區間為 0 到 4294967295;long 類型表示有符號的 64 位(64-bit)整數,區間為 –9223372036854775808 到 9223372036854775807;ulong 類型表示無符號的 64 位(64-bit)整數,區間為 0 到 18446744073709551615;char 類型表示無符號的 16(16-bit)位整數,區間為 0 到 65535。其字符類型的取值范圍符合 Unicode 字符集。盡管 char 字符表現形式與 ushort 一樣,但對其中一種類型進行的所有操作不一定可以對另一種類型進行。整數類型的一元操作符(unary operator)和二元操作符(binary operator)可以操作有符號 32 位精度(precision)、無符號 32 位精度、有符號 64 位精度和無符號 64 位精度的操作數:
+ 和 ~,操作數(operand)會被轉換為類型 T,其中 T 為 int, uint, long 或 ulong 中首個可完全表示操作數所有可能值的類型,而后用類型 T 的精度進行計算,其結果為 T 類型的。-,操作數(operand)會被轉換為類型 T,其中 T 為 int, long 中首個可完全表示操作數所有可能值的類型,然后在 T 類型的精度下進行計算,其結果為 T 類型。一元操作符 - 不支持 ulong 操作數。+、 -、 *、 /、 %、 &、 ^、 |、 ==、 !=、 >、 <、 >= 以及 <=,操作數會被轉換為類型 T,其中 T 是 int, uint, long 或 ulong 中首個可完全表示兩個操作數所有可能值的類型,然后在 T 類型的精度下進行計算,其結果為 T 類型(如果是關系操作符,則返回 bool)。二元操作符不允許一個操作數是 long 而另一個操作數是 ulong。<< 和 >>,左操作數被轉換為類型 T,其中 T 為 int, uint, long 或 ulong 中首個可完全表示操作數的所有可能值的類型,而后用類型 T 的精度執行運算,其結果是 T 類型的。雖然 char 被分類到整形,但它與其它整形在以下兩處地方不同:
character-literals 或帶有(combination)強制轉換類型(cast)為 char 的 integer-literals。比方說 (char)10 和 '/x000A' 一樣。checked 和 unchecked 操作符和語句用于控制 integral-type 算術運算(arithmetic operations)與轉換(conversions,第七章第 6.12 節)的溢出檢查(overflow checking)。在 checked 上下文(context)中,溢出會導致「編譯時錯誤」或導致一個 System.OverflowException 異常被拋出。在 unchecked 上下文中,溢出會被忽略(ignored),并且所有與目標類型(destination type)不匹配(not fit)的高位(high-order bits)都會被丟棄。
C# 支持兩種浮點數(floating-point)類型:float 和 double。float 和 double 類型表示為使用 32
新聞熱點
疑難解答