C#提供了一些預定義類型,大部分是C、C++程式員熟悉的。預定義的參考型別是object和string。object類型是所有類型的最終基類。string類代表了Unicode字串。string對象的值是不可變的。
預定義的實值型別包括有符號和無符號的整型,浮點型,以及bool、char和decimal。有符號的整型有sbyte,short,int,long;無符號的整型有byte,unshort,uint,ulong;浮點型包括float,double。
bool用來表示布爾值:只能是true或false。bool類型使得書寫自描述的代碼更加容易,並且消除了這種C++代碼中常見的錯誤:在該用"=="的地方卻用了"="。在c#中,代碼:
int i = …;
F(i);
if (i = 0) // Bug: the test should be (i == 0)
G();
會導致編譯錯誤,因為運算式i=0的值是int類型的,但是if語句要求使用bool類型的運算式。
char類型用來表示Unicode編碼序列,char類型的變數表示一個16位元的Unicode編碼序列。
decimal類型在浮點運算導致的舍入錯誤變得不可接受時使用,通常包括在金融計算如稅務計算、貨幣兌換。decimal提供至少28位的有效數字。
下面的這個表格列出了這些預定義類型,以及給出了它們的常量值。
類型 |
說明 |
例子 |
object |
所有其他類型的最終基類 |
object o = null; |
string String type; |
一個string是一個Unicode編碼序列 |
string s = "hello"; |
sbyte |
8位元有符號的整型 |
sbyte val = 12; |
short |
16位元有符號整型 |
short val = 12; |
int |
32位元有符號整型 |
int val = 12; |
long |
64位元有符號整型 |
long val1 = 12; long val2 = 34L; |
byte |
8位元無符號整型 |
byte val1 = 12; |
ushort |
16位元無符號整型 |
ushort val1 = 12; |
uint |
32位元無符號整型 |
uint val1 = 12; uint val2 = 34U; |
ulong |
64位元無符號整型 |
ulong val1 = 12; ulong val2 = 34U; ulong val3 = 56L; ulong val4 = 78UL; |
float |
單精確度浮點型 |
float val = 1.23F; |
double |
雙精確度浮點型 |
double val1 = 1.23; double val2 = 4.56D; |
bool |
比爾類型,值只能為true或false |
bool val1 = true; bool val2 = false; |
char |
字元類型,表示Unicode編碼序列 |
char val = 'h'; |
decimal |
精確的小數類型,至少28個有效數字 |
decimal val = 1.23M; |
每一個預定義的類型都對應一個縮寫的系統提供類型。比如,關鍵字代表System.Int32結構類型。作為一種編碼風格,一般用關鍵字代替完整的系統類別型名。
預定義類型在某些方面進行了特殊的處理,但和其他的結構類型差不多。運算子多載允許開發人員定義新的、用法跟預定義類型類似結構類型。比如說,一個Digit結構類型可以支援所有預定義類型支援的運算子,並且能夠定義預定義類型到Digit類型的轉化。
預定義類型預設使用了運算子多載。比如,比較子==和!=對於不同的預定義類型來說有不同的意思:
兩個int類型的運算式包含相同的整型值,那麼它們是相等的
兩個object類型的運算式引用相同的對象,或二者都是null,那麼它們是相等的。
兩個string類型的運算式所引用的字串長度相等並且每個位置對應的字元相同,或二者都為null,那麼他們相等。
請看例子:
using System;
class Test
{
static void Main() {
string s = "Test";
string t = string.Copy(s);
Console.WriteLine(s == t);
Console.WriteLine((object)s == (object)t);
}
}
輸出是:
True
False
原因是第一個比較運算的對象是兩個string類型的運算式,而第二個比較運算的對象是兩個object類型的運算式。
(注意:標準庫會給布爾類型產生一個字串表示,如上面的System.Console.WriteLine,輸出是"True"和"False",而標準的C#布爾值的兩個常量寫作true和false)。