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#中,代码:
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; |
|
32比特有符号整型 |
int val = 12; |
long |
64比特有符号整型 |
long val1 = 12; long val2 = 34L; |
byte |
8比特无符号整型 |
byte val1 = 12; |
|
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,那么他们相等。
请看例子:
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)。