1.1.1 简单类型
C#提供了称为简单类型的预定义结构类型集,简单类型通过保留字标识,而这些保留字只是System命名空间中预定义结构类型的别名。C#简单类型的保留字与预定义结构类型对应关系如表1-1所示。C#简单类型分为整数类型、布尔类型、字符类型、浮点类型和decimal类型。
表1-1 保留字与预定义结构类型对应关系
预定义结构类型和简单类型是等价的。例如,可用下列两种声明中的一种来声明一个整数变量:
int a=10; System.Int32 a=10;
由于预定义结构类型是对象,因此两者都具有成员。如,int具有在System.Int32中声明的成员及从System.Object继承的成员,允许使用下面的语句:
int I=int.MaxValue; // 得到整型量的最大值,是Int32的属性之一 string s=I.ToString(); // 把整型量转换成字符串,是Int32的一个实例方法 string t=123.ToString();
1.整数类型
C#有9种整数类型:sbyte、byte、short、ushort、int、uint、long、ulong和char。取值范围如表2-2所示。
表1-2 整数类型的含义和取值范围
2.浮点类型
C#支持两种浮点类型:float和double。它们用32位单精度和64位双精度IEEE 754格式来表示。Float类型取值范围为1.5×10-45~3.4×1038,精度为7位。double取值范围为5.0×10-324~1.7×10308,精度为15位或16位。
3.decimal类型
decimal类型是用于财务和货币计算的128位数据类型。decimal类型比浮点类型具有更高的精度和更小的范围。decimal类型的范围是1.0×10-28~7.9×1028,精度为28或29个有效数字。当给decimal变量赋值时,使用m后缀来表明它是一个decimal类型。例如:
整型可以被隐式转换为decimal类型,其计算结果为decimal类型。可用整型初始化decimal型变量。如
decimal myMoney=100.3m; decimal myMoney=1000;
浮点类型和decimal类型的精度和表示范围均不相同,它们之间的转换可能会产生溢出异常或精度损失,因此浮点类型和decimal类型之间不存在隐式转换。例如:
decimal myMoney=100.34m; double x=(double) myMoney; myMoney=(decimal) x;
4.布尔类型
布尔类型表示布尔逻辑量。在C#中,布尔逻辑量只有true和false两个值。可以将布尔值赋给布尔形变量,也可以将值为布尔类型的表达式赋给布尔形变量,例如:
bool var=true; bool var=(v > 0 && v < 10); bool var=(20 > 30); bool var=(c == s);
在C和C++中,布尔类型的值和int类型的值可相互转换,即false等效于零值,true等效于非零值。在C#中,布尔型和其他类型之间不存在标准转换。布尔类型与整型截然不同,不能用布尔值代替整型值,反之亦然。例如,下列if语句在C#中是非法的,而在C++中是合法的:
int b=30; if(b) cout << "The value of b is true";
在C#中,正确的用法是通过显式地将整数或浮点值与零进行比较;或者是显式地将对象引用与null进行比较来完成的,例如:
int b=30; if (b != 0) System.Console.WriteLine("The value of b is true");
或
if (0 != b) System.Console.WriteLine("The value of b is true");
5.字符类型
除了数字以外,计算机处理的信息主要是字符。C#字符类型采用Unicode字符集,一个Unicode标准字符长度为16位,它允许用单个编码方案表示世界上使用的所有字符。
可以按如下方法直接给一个字符变量赋值:
char c='c';
此外,也可以通过十六进制转义符(前缀“\x”加十六进制数字)或Unicode转义符(前缀“\u”加十六进制数字)给字符变量赋值,例如:
char c='\x0067'; char c='\u0067';
不存在从其他类型到char类型的隐式转换。对字符变量使用整数进行赋值和运算是不允许的。但是,字符型和整型之间可以进行显式转换,例如:
char c=(char)10; int d=(int) 'j';
C#使用Unicode转义符,表1-3列出了各种转义符。
表1-3 转义符