第3章C#程序设计基础3.1标识符3.2C#的数据类型3.3C#的变量和常量3.4结构类型和枚举类型3.5C#运算符和表达式3.6C#的常用类和结构3.1标识符C#的标识符名称必须遵守以下规则:(1)所有的标识符只能由字母、数字和下划线这3类字符组成,且第一个字符必须为字母或下划线。(2)标识符中不能包含空格、标点符号、运算符等其他符号。(3)标识符严格区分大小写。(4)标识符不能与C#关键字名相同。(5)标识符不能与C#中的类库名相同。a12_c√1abc3.2C#中数据类型数据类型值类型引用类型简单类型结构类型枚举类型整数类型字符类型布尔类型实数类型sbytebyteshortushortintuintlongulongfloatedoubledecimal类委托数组接口C#中数据类型分类3.2.1值类型值类型的变量内含变量值本身,C#的值类型可以分为简单类型、结构类型和枚举类型。下面仅介绍简单类型。1.整数类型类型标识符说明占用位数取值范围示例sbyte带符号字节型8-128~127sbytei=10;byte无符号字节型80~255bytei=10;short带符号短整型16-32,768~32,767shorti=10;ushort无符号短整型160~65,535ushorti=10;int带符号整型32-2,147,483,648~2,147,483,647inti=10;uint无符号整型320~4,294,967,295uinti=10;uinti=10U;long带符号长整型64-9,223,372,036,854,775,808~9,223,372,036,854,775,807longi=10;longi=10L;ulong无符号长整型640~18,446,744,073,709,551,615ulongi=16;ulongi=16U;ulongi=16L;ulongi=16UL;2.实数类型类型标识符说明取值范围示例float单精度浮点数±1.5×10-45~3.4×1038,精度为7位数floatf=1.23F;double双精度浮点数±5.0×10-324~1.7×10308,精度为15到16位数doubled=1.23;decimal固定精度的浮点数1.0×10-28到~7.9×1028的之间,精度为28至29位有效数字decimald=1.23M;3字符类型例如,可以采用如下方式字符变量赋值:charc='H';//字符Hcharc='\x0048';//字符H,十六进制转义符(前缀为\x)charc='\u0048';//字符H,Unicode表示形式(前缀为\u)charc=‘\r’;//回车,转义字符在表示一个字符常数时,单引号内的有效字符数量必须且只能是一个,而且不能是单引号或者反斜杠(\)。4.布尔类型布尔类型数据用于表示逻辑真和逻辑假,布尔类型的类型标识符是bool。3.2.2引用类型引用类型也称为参考类型。和值类型相比,引用类型的变量不直接存储所包含的值,而是指向它所要存储的值。类似C中的指针。1.object类object是C#中所有类型(包括所有的值类型和引用类型)的基类,C#中的所有类型都直接或间接地从object类中继承而来。因此,对一个object的变量可以赋予任何类型的值。floatf=1.23;objectobj1;//定义obj1对象obj1=f;objectobj2=China;//定义obj2对象并赋初值2.string类C#还定义了一个string类,表示一个Unicode字符序列,专门用于对字符串的操作。同样,这个类也是在.NETFramework的命名空间System中定义的,是类System.String的别名。字符串在实际中应用非常广泛,利用string类中封装的各种内部操作,可以很容易完成对字符串处理。例如:stringstr1=123+abc;//+运算符用于连接字符串charc=“HelloWorld!”[2];//“[]”运算符可以访问string中的单个字符,c='e'stringstr2=China;stringstr3=@China;//字符串的另一种表示形式,用@引起来。boolb=(str2==str3);//“==”运算符用于两个字符串比较,b=true3.2.3类型转换数据类型在一定条件下是可以相互转换的,如将int型数据转换成double型数据。C#允许使用两种转换的方式:隐式转换和显式转换。1.隐式转换隐式转换是系统默认的、不需要加以声明就可以进行的转换。源类型目标类型sbyteshort、int、long、float、double、decimalbyteshort、ushort、int、uint、long、ulong、float、double、decimalshortint、long、float、double、decimalushortint、uint、long、ulong、float、double、decimalintlong、float、double、decimaluintlong、ulong、float、double、decimallongfloat、double、decimalulongfloat、double、decimalcharushort、int、uint、long、ulong、float、double、decimalfloatdouble2.显式转换显式转换又叫强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型,一般在不存在该类型的隐式转换时才使用。格式如下:(类型标识符)表达式其作用是将“表达式”值的类型转换为“类型标识符”的类型。例如:(int)1.23//把double类型的1.23转换成int类型,结果为1需要提醒注意以下几点:(1)显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型,转换就无法进行。(2)对于从float、double、decimal到整型数据的转换,将通过舍入得到最接近的整型值,如果这个整型值超出目标类型的范围,则出现转换异常。【例3.1】设计一个控制台程序说明类型转换的应用。usingSystem;namespaceProj3_1{classProgram{staticvoidMain(string[]args){inti=65,i1,i2;doubled=66.3456,d1,d2;charc='A',c1,c2;Console.WriteLine(i={0:d5},d={1:f},c={2},i,d,c);i1=(int)d;//强制类型转换d1=i;//隐式类型转换c1=(char)i;//强制类型转换Console.WriteLine(i1={0:d5},d1={1:f},c1={2},i1,d1,c1);i2=c;//隐式类型转换d2=(int)d;//强制类型转换,转换成整数后再隐式转为double类型c2=(char)d;//强制类型转换Console.WriteLine(i2={0:d5},d2={1:f},c2={2},i2,d2,c2);}}}3.2.4装箱和拆箱1.装箱转换装箱转换是指将一个值类型的数据隐式地转换成一个对象类型的数据。例如,下面语句就执行了装箱转换:inti=8;objectobj=i;或objectobj=(object)i;2.拆箱转换拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。例如,下面语句就执行了拆箱转换:objectobj=2;inti=(int)obj;拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。3.3C#中的变量和常量3.3.1变量1.变量定义在C#程序里使用某个变量之前,必须要告诉编译器它是一个什么样的变量,因此要对变量进行定义。定义变量的方法如下:[访问修饰符]数据类型变量名[=初始值];例如:stringname=王华;intage=20;也可以同时声明一个或多个给定类型的变量,例如:inta=1,b=2,c=3;2.理解值类型的变量如果一个变量的值是普通的类型,那么这个C#变量就是值类型的变量。值类型的变量直接把值存放在变量名标记的存储位置上。当定义一个值类型变量并且给它赋值的时候,这个变量只能存储相同类型的数据。所以,一个int类型的变量就只能存放int类型的数据。另外,当把值赋给某个值类型的变量时,C#会首先创建这个值的一个拷贝,然后把这个拷贝放在变量名所标记的存储位置上。例如:intx;inty=2;x=y;3.理解引用类型的变量引用表示所使用的是变量或对象的地址而不是变量或对象本身。当声明引用类型变量时,程序只是分配了存放这个引用的存储空间。要想创建对象并把对象的存储地址赋给该变量,就需要使用new操作符。例如:MyClassvar;//MyClass是已定义的类或类型var=newMyClass();数组示例:int[]a=newint[3]{1,2,3};for(inti=0;i3;i++)Console.Write({0},a[i]);3.3.2常量1.直接常量直接常量是指把程序中不变的量直接硬编码为数值或字符串值,例如,以下都是直接常量:100//整型直接常量1.23e5//浮点型直接常量2.符号常量符号常量是通过关键字const声明的常量,包括常量的名称和它的值。常量声明的格式如下:const数据类型常量名=初始值;其中,“常量名”必须是C#的合法标识符,在程序中通过常量名来访问该常量。“类型标识符”指示了所定义的常量的数据类型,而“初始值”是所定义的常量的值。例如:constdoublePI=3.14159265;3.4结构类型和枚举类型3.4.1结构类型1.结构类型的声明结构类型由若干“成员”组成的。数据成员称为字段,每个字段都有自已的数据类型。声明结构类型的一般格式如下:struct结构类型名称{[字段访问修饰符]数据类型字段1;[字段访问修饰符]数据类型字段2;...[字段访问修饰符]数据类型字段n;};例如,以下声明一个具有姓名和年龄的结构体类型Student:structStudent//声明结构类型Student{publicintxh;//学号publicstringxm;//姓名publicstringxb;//性别publicintnl;//年龄publicstringbh;//班号};2.结构类型变量的定义声明一个结构类型后,可以定义该结构类型的变量(简称为结构变量)。定义结构变量的一般格式如下:结构类型结构变量;例如,在前面的结构类型Student声明后,定义它的两个变量如下:Students1,s2;3.结构变量的使用1)访问结构变量字段访问结构变量字段的一般格式如下:结构变量名.字段名例如,s1.xh表示结构变量s1的学号,s2.xm表示结构变量s2的姓名。结构体变量的字段可以在程序中单独使用,与普通变量完全相同。2)结构变量的赋值结构变量的赋值有两种方式。结构变量的字段赋值:使用方法与普通变量相同。结构变量之间赋值:要求赋值的两个结构变量必须类型相同。例如:s1=s2;这样s2的所有字段值赋给s1的对应字段。【例3.2】设计一个控制台程序说明结构类型的应用。usingSystem;namespaceProj3_2{classProgram{structStudent//结构类型声明应放在Main函数的外面{publicintxh;//学号publicstringxm;//姓名publicstringxb;//性别publicintnl;//年龄publicstringbh;//班号}staticvoidMain(string[]args){Students1,s2;//定义两个结构类型变量s1.xh=101;s1.xm=李明;s1.xb=男;s1.nl=20;s1.bh=07001;Console.WriteLine(学号:{