《{流程管理流程再造}数据类型与流程控制讲义》由会员分享,可在线阅读,更多相关《{流程管理流程再造}数据类型与流程控制讲义(57页珍藏版)》请在金锄头文库上搜索。
1、第2章 数据类型与流程控制,2.1 数据类型,2.1.1 C#数据类型的分类 为了方便识别和处理,编程语言系统中的不同信息在计算机中具有不同的表示,占用不同的储存空间,这些信息在语言系统中称之为数据类型。 C#中的数据类型和C+是类似的。但在C#中数据类型分为两种:值类型和引用类型,如图2-1所示。值类型包括一些数值类型(例如int和float)、char、枚举类型和结构类型。引用类型包括类、接口、委托(delegate)和数组类型。在C#中,内置数据类型除了字符串(string)类型与对象(object)类型外,其余均为值类型。,2.1 数据类型,C#中的数据类型的划分如图2-1所示。,2.
2、1 数据类型,值类型和引用类型的区别在于:值类型变量直接存储在堆栈中,且占用空间大小相对固定,变量直接包含他们的数据,可以直接访问其值,访问速度快;而引用类型数据需要通过存储在栈中的引用来间接访问其值,实际内容存储在内存的堆中,占用空间大小不固定,访问速度慢。 表2-1所示为值类型和引用类型的区别。,2.1 数据类型,1整数类型 整数类型(也叫整型)表示无小数部分的数字。根据变量在内存中所占的位数不同,C#将整型分为8种:字节型(sbyte)、无符号字节型(byte)、短整型(short)、无符号短整型(ushort)、整型(int)、无符号整型(uint)、长整型(long)、无符号长整型(
3、ulong)。整型的说明及示例如表2-2所示。,2.1 数据类型,表2-2 整数类型的关键字及说明,2.1 数据类型,2实数类型 C#中的实数类型有3种:float、double、decimal。其中double的取值范围最广,decimal取值范围其次,但它的精度高。具体见表2-3。 表2-3 实数类型的关键字及说明,2.1 数据类型,3字符类型和字符串类型 字符类型也叫字符型,用char表示,为单个Unicode字符,一个Unicode字符的标准长度为两个字节,它在机器中占16位,其范围为065535。字符一般是用单引号括起来的一个字符,如:a,A,也可以写成转义字符、十六进制转换码或Un
4、icode表示形式。此外,整数也可以显式地转换为字符。,2.1 数据类型,常用的转义字符如表2-4所示。,2.1 数据类型,4布尔类型 布尔型主要用于逻辑判断,这种类型的数据只有true和false两个值。在C+中,false相当于0,true相当于1。但在C#中,废弃了这种不正规的表达方式,true值不能被任何非零值取代,将整数类型转换为布尔类型是不合法的。例如: bool x=1; / 错误,不存在这种写法 bool y=1; / 错误,不存在这种写法 bool x= true; / 正确,可以被执行,2.1 数据类型,5枚举类型 枚举类型是值类型的一种特殊形式,它从System.Enum
5、继承而来,并为基础类型的值(如Byte、Int32或UInt64)提供替代名称。枚举类型也是一种自定义数据类型,它允许用符号代表数据。枚举是指程序中某个变量具有一组确定的值,通过“枚举”可以将其值一一列出来。 enum关键字用于声明枚举类型,基本格式如下: enum 枚举类型名 由逗号分隔的枚举数标识符 ;,2.1 数据类型,【例2-1】枚举类型示例。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ex01 class Program enum we
6、ek monday, tuesday, wednesday, thursday, friday, saturday, sunday ; static void Main(string args) week day = week.thursday; int a = (int)day; int b = (int)week.sunday; Console.WriteLine(a=0,b=1, a, b); Console.ReadLine(); ,2.1 数据类型,6结构类型 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数、常数、字段、方法、属性、索引器等。结构与类不同在
7、于结构为值类型而不是引用类型,并且结构不支持继承。结构类型将在第4章讲解。,2.2 不同数据类型之间的转换,2.2.1 显式转换与隐式转换 1. 隐式转换 C#是一个强类型的语言,它的数值类型有一些可以进行隐式转换,其他的必须显式转换,隐式转换的类型只能是长度短的类型转换成长的类型(见表2-5所示),例如int可以转换成long,float,double,decimal;反之必须显式的转换。例如: int a=7; float b=a; /隐式转换 a=(int)c; /显示转换,2.2 不同数据类型之间的转换,表2-5 C#中支持的隐式转换,2.2 不同数据类型之间的转换,2. 显式转换 显
8、式转换又叫强制类型转换,与隐式转换相反,显式转换需要用户明确地指定转换类型,一般在不存在该类型的隐式转换时才使用。格式如下: (类型标识符)表达式 其作用是将“表达式”值的类型转换为“类型标识符”的类型。例如: (int)1.23 /把double类型的1.23转换成int类型,结果为1,2.2 不同数据类型之间的转换,使用上面的显示转换不能用在bool和string类型上,如果希望string或者bool类型和整数类型之间的转化可以使用一个方法Convert。格式如下: Convert.方法名 (参数) 方法名是To数据类型形式,具体含义见表2-6。,2.2 不同数据类型之间的转换,表2-6
9、 Convert.方法含义,2.2 不同数据类型之间的转换,2.2.2 装箱和拆箱 对于值类型和Object类型之间的转换,可以用装箱技术和拆箱技术来实现。C#中的任何类型的值都可以按照对象来处理,使用object类型的通用库(如.NET Framework中的集合类)既可以用于引用类型,又可以用于值类型。 (1)Object类 Object类是所有类的基类,它是System命名空间下的一个类,C#中所有的类型都是直接或间接地从Object类继承而来。因为它是所有对象的基类,所以可把任何类型的值赋给它,例如,一个整型: object theObj = 123;,2.2 不同数据类型之间的转换,
10、1. 装箱转换 装箱转换是指将一个值类型的数据隐式地转换成一个对象类型的数据。把一个值类型装箱,就是创建一个obj ect类型的实例,并把该值类型的值复制给这个obj ect实例。例如,下面语句就执行了装箱转换: int i=123; object obj=i; /装箱转换,2.2 不同数据类型之间的转换,上面的两条语句中,第1条语句先声明一个整型变量i并对其赋值,第2条语句则先创建一个obj ect类型的实例obj,然后将i的值复制给obj。装箱操作过程如图2-2所示。 在执行装箱转换时,也可以使用显式转换,如: object obj=(object)i;,2.2 不同数据类型之间的转换,2
11、. 拆箱转换 拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。例如,下面语句就执行了拆箱转换: int i=123; object obj=i; int j=(int)obj; /拆箱转换 拆箱操作的过程如图2-3所示。拆箱转换需要(而且必须)执行显式转换,这是它与装箱转换的不同之处。,2.3 常量和变量,2.3.1 常量 常量就是值在程序整个生命周期内值始终不变的量。在声明常量时,要用到const关键字,和C+类似。常量在使用的过程中,不可以对其进行赋值的改变,否则系统会自动报错。 常量声明的基本语法为: const int / double / long / bool / st
12、ring / 常量名; 下面是一个具体声明常量的例子: const double PI=3.1415926;,2.3 常量和变量,2.3.2 变量 变量代表了存储单元,每个变量都有一个数据类型。这决定了这个变量可以存储什么值。在任何一种语言中,变量的命名都是有一定的规则的,当然 C#.NET也不例外,若在使用中定义了不符合一定规则的变量,C#.NET语言系统会自动报错。 变量命名规则如下: (1)变量名的第一个字符必须是字母、下划线(_)或者。 (2)除去第一个字母外,其余的字母可以是字母、数字、下划线的组合。 (3)不可以使用对C#编译器而言有特定含义的名字(即C#语言的库函数名称和关键字名
13、称)作为变量名,如using 、namespace 、struct等等。,2.3 常量和变量,2.3.3 变量的作用范围(作用域) 变量不但有类型,还有作用范围。变量的作用范围就是应用程序中可以使用和操作变量的部分。变量的作用域和C+类似,分为局部作用域和类作用域。 (1)局部作用域 方法(即函数)中声明的任何变量都具有那个方法的作用域;一旦方法结束,它们也会消失,而且只能由那个方法内部执行的代码来访问。,2.3 常量和变量,这些变量称为局部变量(local variable),因为它们局限于声明它们的那个方法,不能在其他任何方法中使用。换言之不能使用局部变量在不同的方法之间共享信息。例如:
14、class Example void firstMethod() int myVar; . void anotherMethod() myVar = 42; / 错误 变量越界 . ,2.3 常量和变量,(2)类作用域 在类中(但不在一个方法中)声明的任何变量都具有那个类的作用域。例如: class Example int myField = 0; void firstMethod() myField = 42; / 正确 . void anotherMethod() myField = 42; /正确 . ,2.4 运算符与表达式,2.4.1 运算符 运算符指明了进行运算的类型,例如,加号(
15、+)用于加法、减号(-)用于减法、星号(*)用于乘法、正斜杠(/)则用于除法等。 1算术运算符 算术运算符包括: *(乘法运算符)、/(除法运算符)、%(求余运算符,如7%3=1)、+(加法运算符)、(减法运算符)、+(增量运算符)和-(减量运算符)。,2.4 运算符与表达式,增量和减量运算符都是单目运算符,运算结果是将操作数增1或减1。这两个运算符都有前置和后置两种形式。前置形式是指运算符在操作数的前面,后置是指运算符在操作数的后面。例如: a+; / 等价于a=a+1; + a; / 等价于a=a+1; a-; / 等价于a=a-1; -a / 等价于a=a-1;,2.4 运算符与表达式,
16、注意: (1)C#语言算术表达式的乘号(*)不能省略。例如:数学式b2-4ac相应的C+表达式应该写成:b*b-4*a*c。 (2)C#语言表达式中只能出现字符集允许的字符。例如:数学r2相应的C+表达式应该写成:PI*r*r。(其中PI是已经定义的符号常量)。 (3)C#语言算术表达式只使用圆括号改变运算的优先顺序(不要指望用或 )。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。,2.4 运算符与表达式,2赋值运算符 赋值运算符包括基本赋值运算符()和复合赋值运算符,复合赋值运算符包括:=、*=、/=、=、+=、-=、=和 注意:赋值运算符、复合赋值运算符的优先级比算术运算符低。,2.4 运算符与表达式,3比较运算符 (1)比较数值。有六种比较运算符可以