1、2.1 数据类型数据类型是程序设计的基础,在进行程序设计时,必须让计算机了解需要处理的是什么数据,以什么方式保存和显示数据。为此,C#定义了很多数据类型,对程序中声明的保存信息的变量必须说明它的数据类型。本节主要介绍常用的数据类型及其基本用法。第2章 变量与表达式 2.1.1 数据类型的分类C#提供的数据类型可以分为两大类,一类是值类型,另一类是引用类型。值类型又划分为简单类型、枚举类型和结构类型;引用类型则分为类类型、接口类型、数组类型和委托类型。2.1.2 值类型值类型是一种表示实际值的数据类型,C#的值类型包括:简单类型、枚举类型和结构类型3种。1.简单类型C#提供已经定义好的简单类型,
2、包括:整型、实型、布尔型和字符型。(1)整型整型是指数据的值是整数。根据变量在内存中所占的位数不同,C#语言提供8中整型分别是:短字节型(sbyte)、字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(ulong)。这些不同的整型用来存储不同范围的数值,占用不同的内存空间,数据类型取值范围说明类型指定符sbyte-1281271字节有符号整数byte02551字节无符号整数short-32768327672字节有符号整数ushort0655352字节无符号整数int-2147483648214748
3、36474字节有符号整数uint042949672954字节无符号整数Ulong-922337203685477580892233720368547758078字节有符号整数Lulong0184467440737095516158字节无符号整数UL(2)实型实数类型是一种同时使用整数部分和小数部分表示数值的类型,分为单精度(float)、双精度(double)和小数型(decimal),它们的区别在于取值范围和精度不同。计算机对实数的运算能力大大低于整数,单精度类型常用于对精度要求不高的计算,对结果要求精确的使用双精度型,decimal类型适合用于财务和货币计算。数据类型取值范围说明类型指定符
4、float1.510-453.410384字节单精度实数Fdouble5.010-3241.7103088字节双精度实数Ddecimal1.010-287.9102816字节实数M(3)布尔型布尔型(bool数据类型)是只有true和false2个无符号值的类型。如果变量只能表示“是/否”或“真/假”信息的,则将它定义为bool类型;可以将布尔型值赋值给布尔型变量(4)字符类型字符类型用char表示,为单个Unicode字符,一个Unicode字符是2个字节长度;字符包括数字字符、英文字符、表达符号等等,字符型的变量可以用单引号引起来的字符常量直接赋值;不包含任何字符的字符串,称为空字符串。C
5、#中提供转义符,用来表示单引号和反斜杠等特殊的字符常数,在需要表示这些特殊常数的位置,使用这些转义符来代替字符。常用转义符如表2-3所示。表2-3 常用转义符转义符字符名称单引号双引号反斜杠0空字符a发出一声响铃b退格r回车n换行2.结构类型 程序设计中,往往需要一些复杂的数据类型来表示数据。C#中使用结构类型(Structure)把多个不同类型的数据组合到一起。结构类型可以定义常数、字段、属性、方法、索引器、操作符和嵌套类型,使用结构类型的优点是节省内存空间,可以不使用继承或引用标示。结构体是一种复合的数据类型,它允许用其他数据类型构成一个结构类型,而一个结构类型变量内的所有数据可以作为一个
6、整体进行处理。定义结构类型的语法如下:struct 结构体标示符 public 类型 成员变量名1;public 类型 成员变量名2;public 类型 成员变量名3;.;3.枚举类型枚举是这样的种数据类型:它的值有固定的范围,在逻辑上是密不可分的整数值,这些值可以用有限个常量来叙述,例如:星期、月份等。枚举类型使用关键字enum定义,语法如下:enum 枚举名 标示符1=整型常数,标示符2=整型常数,标示符3=整型常数,标示符4=整型常数,.2.1.3 引用类型引用类型又称对象,引用类型是不直接存储变量值的,存储的是引用值的地址。使用时,引用也可以为null,这表示当前不引用或不指向任何对象
7、。C#的引用类型有类、数组、委托和接口4种。这里简单介绍object(对象类型)和string(字符串类型)两个类。2.1.4 类型转换在C#中,有些数据类型可以转换为另一种数据类型。如果是一种值类型转换为另一种值类型,或者一种引用类型转换为另一种引用类型,比较常用的转换方式是:隐式转换与显式转换。对于不同值类型之间的转换,可以使用Convert类提供的静态方法。1.隐式转换隐式转换就是将低精度数值转换为高精度数值,转换顺序如表2-4所示。若,两种变量类型是兼容的或目标类型的取值范围大于源类型,这样的类型转换就由系统自动完成。例如:int a=100;/定义整型变量a并赋值float b=a;
8、/整型变量a隐式转换为浮点数赋值给b 表2-4 隐式转换源类型与目标类型对应表 源类型可以转换的目标类型sbyteshort、int、long、float、double、decimalbyteshort、ushort、int、uint、long、float、double、decimalcharushort、int、uint、long、float、double、decimalintlong、float、double、decimaluintlong、ulong、float、double、decimalshortint、long、float、double、decimalushortint、uint、
9、long、float、double、decimallongfloat、double、decimalulongfloat、double、decimalfloatdouble2.显式(强制)转换在不满足隐式转换的情况下,必须使用显式(强制)转换。显式(强制)转换是一种指令,该指令通过编译器强制将一种类型转换为另一种类型。语法为:(目标类型)变量或表达式例如:int a=65;/定义整型变量a并赋值short b=(short)a;/将a强制转换为短整型char c=(char)a;/将a强制转换为字符型3.Convert类C#的Convert类提供多种方法来进行显式(强制)转换,语法为:目标类型=
10、Convert.转换方法(源类型)例如:int num;/定义整型变量numnum=Convert.ToInt16(78);/将字符串78强制转换为整型并赋值给num 4.ToString()方法ToString()方法主要用于将一些类型的变量转换为字符串类型。语法为:变量名.ToString()例如:int a=100;string s=a.ToString();字符串变量s的值为100。5.Parse()方法Parse()方法用于将特定格式的字符串转换为数值类型。语法格式为:数值类型名.Parse(字符串表达式)但是,语法格式中的“字符串表达式”的值必须符合“数值类型名”对应的数值格式要求
11、。例如:int x=int.Parse(123);/将123转换为整型赋值给xint y=int.Parse(123.4);/因为123.4不符合整型的格式,所以转换失败int y=float.Parse(123.4);/因为123.4符合浮点数型的格式,所以转换成功 2.1.5 装箱与拆箱对于值类型与Object类型之间的转换,可以用装箱和拆箱技术来实现。C#的类型系统是统一的。它使值类型可以被看成是对象,装箱转换允许将值类型隐式转换为引用类型。装箱的过程是:首先分配一个对象实例,然后将值类型的值复制到实例中。拆箱过程是:首先检查对象实例是否为给定值类型一个装了箱的值,然后将该值从实例中复制
12、出来。1.装箱装箱操作将值类型隐式转换为Object类型,为装箱数值分配对象实例。例如:int i=123;object ob=i;/装箱上述语句执行结果是在堆栈中创建对象ob,该对象引用了堆中的int类型,该数值是赋给变量i的数值备份。2.拆箱拆箱操作是显式的将object类型转换为值类型。下面语句演示了装箱和拆箱。int i=123;object ob=i;/装箱int j=(int)ob;/拆箱可以看出,拆箱是装箱的逆过程,要注意的是,装箱和拆箱需要遵守类型兼容的原则。2.2 变量与常量 知道了C#有哪些数据类型以及如何将一种数据类型转换为另一种数据类型,我们还需要知道C#中有哪些常量和
13、变量以及如何定义常量和变量。2.2.1 变量 变量用来表示一个数值、一个字符串值或者一个类的对象。变量存储的值可能会发生更改,但变量名保持不变。1.变量声明C#中,变量必须先声明后使用。声明变量的语法为:类型标识符 变量名;或类型标识符 变量名1,变量名2,变量名3.;例如,下面语句声明了一些变量:int num;/声明整型变量numfloat sum;/声明浮点型变量sumchar ch;/声明字符型变量ch2.变量命名规则 C#在变量声明时,变量名的命名应该遵守一些基本规则:变量名长度不能超过255个字符。变量名在有效的程序范围内是唯一的。变量名不能是关键字(保留字),但可以嵌入使用关键字
14、到变量名。变量名用字母开头,不要使用数字开头。关键字是一种高级程序设计语言中属于语言成分的特殊标识符,用户是不能使用这些标识符定义各种名称的。2.2.2 变量的种类C#定义了7种变量,即静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。2.2.3 常量 常量就是值在程序整个生命周期内始终不变的量,使用关键字const声明。在使用中,不可以对常量进行赋值。常量声明的语法为:访问修饰符const类型标识符 常量名=值;例如:public const double PI=3.1415926;const int dayinyear=365;语法中方括号表示其中的内容是可选项,如果采用
15、逻辑符号“|”表示“|”两端的内容是或者得关系。2.3 运算符与表达式 运算符是指在表达式中执行哪些操作的符号。表达式则由常量、变量、对象以及各种运算符组成。2.3.1 运算符分类 按照操作数分类,C#语言提供3大类运算符。一元运算符:带一个操作数的运算符称为“一元”运算符,如i+。二元运算符:带两个操作数的运算符称为“二元”运算符,如x+y。三元运算符:带三个操作数的运算符称为“三元”运算符,C#中只有一个三元运算符,即条件运算符“?:”。2.3.2 算术运算符C#中算术运算符就是用于常规运算功能的符号,包括:加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)、求余运算符
16、(%)、自增运算符(+)、自减运算符(-)、要注意的是乘法、除法运算符只适用于整数和实数之间的操作;默认运算返回值与精度高的类型相同。求余运算符用来求除法的余数。2.3.3 赋值运算符赋值运算符用于改变变量的值,即为变量赋值。C#中提供了一个简单赋值运算符“=”和多个复合赋值运算符包括:+=、-=、*=、/=、%=、=、&=、=和|=。赋值运算符是左结合,将右边的操作数的值赋给左边的操作数,左操作数必须是变量。C#也可以对变量进行连续赋值,此时赋值运算是从右向左进行。2.3.4 关系运算符关系运算符用于在程序中比较两个值大小,关系运算的结果是布尔型。关系运算符包括:=、!=、=。2.3.5 逻
17、辑运算符逻辑运算中,使用逻辑运算符将运算对象连接起来形成逻辑表达式,逻辑运算只有两个结果:true和false,表示真和假。2.3.6 三目运算符?:该运算符是根据布尔表达式的值返回两个值中的一个。如果条件为真,则返回第一个值;否则,返回第二个值。语法为:(布尔表达式)?值1:值22.3.7 运算符优先级当一个表达式包含多个运算符时,表达式的值就由各运算符的优先级决定。表2-7为运算符的优先级描述。表2-7 运算符优先级(由高到低)特殊运算符()一元运算符+(正)、-(负)、!(逻辑非)乘/除运算符*、/、%加/减运算符+、-移位运算符关系运算符、=、is比较运算符=、!=逻辑与运算符&逻辑异
18、或运算符逻辑或运算符|条件与运算符&条件或运算符|三目运算符?:赋值运算符=、+=、-=、*=、/=、%=2.4 输入与输出程序设计中,输入与输出是程序的必需功能。数据的输入与输出方式有控制台方式和文件方式两种。控制台是一个操作系统窗口,用户可通过键盘输入文本,并从显示器读取文本输出。C#语言的控制台I/O主要通过命名空间System中的Console类实现的。该类给出了标准的输入和输出方法。1.控制台输入控制台输入包含两个实现控制台输入的方法:Read()和ReadLine()。Read()方法每次从标准输入流中读取一个字符(此时程序运行到Read()语句暂停,直到输入任意字符并按回车键才返
19、回继续运行),程序将接收的字符作int型值返回给变量。如果输入流没有字符,则返回-1。Read()方法使用的语法格式为:Console.Read();ReadLine()方法用于从控制台一次读取一行字符串,直到遇到回车键才返回读取的字符串,但此字符串不包含回车键和换行符;如果接收无效字符串,则ReadLine()方法返回null。ReadLine()方法的语法格式为:Console.ReadLine();2.控制台输出控制台输出输出包含两个方法:Write()和WriteLine()。它们都可以输出一个或多个值,区别在于Write()方法输出后没有换行符,而WriteLine()方法输出后有换行符。两个方法都有各种不同的重载,为输出多个不同类型数据提供支持。语法格式如下:Console.Write(“格式字符串”,参数表);或Console.WriteLine(“格式字符串”,参数表);小结本章主要介绍了C#语言中的数据类型、变量与常量、以及运算符与表达式。其中,重点是掌握数据类型与变量,以及表达式的使用方法,为后续编写C#程序代码奠定基础。