您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 第4章 类型转换和命名空间
Page:2学习目标正确完成隐式和显式转换;理解和掌握装箱和拆箱操作;合理利用命名空间来组织应用程序的结构;声明和引用命名空间,利用别名来简化编程。第四章类型转换和命名空间Page:34.1类型转换C#中数据类型的转换可以分为两种形式:隐式转换和显式转换。第四章类型转换和命名空间4.1.1隐式转换【学一学】隐式转换可以分为数值类型隐式转换、枚举类型隐式转换和引用类型隐式转换,下面介绍前两种,而引用类型隐式转换将在单独的章节进行介绍。1.数值类型隐式转换下表4-1列出了C#支持的数值类型隐式转换。转换前的类型转换后的类型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,decimalLong,ulongFloat,double,decimalfloatdoublecharUshort,int,uint,long,ulong,float,double,decimal表4-1C#中的数值类型隐式转换Page:44.1类型转换第四章类型转换和命名空间4.1.1隐式转换从表4-1可以看出,数值类型隐式转换实际上就是从低精度的数值类型到高精度的数值类型的转换。换句话说,就是从“小类型”到“大类型”或者是从无符号整数到有符号整数的转换。以下代码说明了这种形式的转换。bytex=16;Console.WriteLine(x={0},x);ushorty=x;Console.WriteLine(y={0},y);y=65535;Console.WriteLine(y={0},y);floatz=y;Console.WriteLine(z={0},z);上述代码的运行结果如下:x=16;y=16;y=65535;z=65535;Page:54.1类型转换第四章类型转换和命名空间4.1.1隐式转换2.枚举类型隐式转换枚举类型隐式转换允许把十进制整数0转换成任何枚举类型,而其它的整数则不允许这种隐式转换。例如,WeekDay是一个定义的代表星期的枚举类型,下列代码就说明了枚举类型的隐式转换。Weekdayday;day=0;Console.WriteLine(day);上述代码能正确编译并运行,如果将代码中的第2行更改为:day=1;则编译会出错,因为非十进制整数0不存在枚举类型隐式转换。Page:64.1类型转换第四章类型转换和命名空间4.1.2显示转换【学一学】显式类型转换,又叫强制类型转换。与隐式转换正好相反,显式转换需要用户明确地指定转换的类型。显式类型转换的语法格式如下:类型变量1=(转换后的类型)变量2;通过上述格式,编译器可以将右侧的值转换为括号中指定的数据类型,例如:intx=500;shortz=(short)x;//显式转换为short,z值为500显式转换可以分为数值类型显式转换、枚举类型显式转换和引用类型显式转换,下面只介绍前两种。数值类型显式转换数值类型显式转换是指当不存在相应的隐式转换时,将一种数值类型转换成另一种数值类型。下表4-2列出了C#支持的数值类型显式转换。转换前的类型转换后的类型sbyteByte,ushort,uint,ulong,charbyteSbyte,charshortSbyte,byte,ushort,uint,ulong,charushortSbyte,byte,short,charintSbyte,byte,short,ushort,uint,ulong,charuintSbyte,byte,short,ushort,int,charlongSbyte,byte,short,ushort,int,uint,ulong,charulongSbyte,byte,short,ushort,int,uint,long,charcharSbyte,byte,shortfloatSbyte,byte,short,ushort,int,uint,long,ulong,char,decimaldoubleSbyte,byte,short,ushort,int,uint,long,ulong,char,float,decimaldecimalSbyte,byte,short,ushort,int,uint,long,ulong,char,float,doublePage:74.1类型转换第四章类型转换和命名空间4.1.2显示转换枚举类型显式转换枚举类型显式转换实际上是枚举类型的元素类型与相应类型之间的隐式或显式转换。比如,有一个元素类型为int的枚举类型E,则当执行从E到byte的枚举类型显式转换时,实际上是执行从int到byte的数值类型显式转换;当执行从byte到E的枚举类型显式转换时,实际上是执行从byte到int的数值类型隐式转换。下列代码是对整数3进行枚举类型显式转换,其中WeekDay是一个定义好的代表星期的枚举类型Weekdayday;day=(Weekday)3;Console.WriteLine(day);程序编译没有错误,运行结果如下:3Page:84.1类型转换第四章类型转换和命名空间4.1.3引用类型转换【学一学】引用类型转换包括类之间、类与接口之间、接口之间、委托之间,以及数组之间的类型转换。由于引用类型的变量只是保存对目标对象的引用,因此任何引用转换都不会修改对象的内容,也就不会有信息丢失。引用类型转换分为隐式和显式转换两种。1.引用类型隐式转换引用类型隐式转换包括以下几种:从任何引用类型到对象类型的转换。从类类型S到类类型T的转换,其中S是T的派生类。从类类型S到接口类型T的转换,其中类S实现了接口T。从接口类型S到接口类型T的转换,其中T是S的父接口。从元素类型为Ts的数组类型S向元素类型为Tt的数组类型T的转换。Page:94.1类型转换第四章类型转换和命名空间4.1.3引用类型转换例如,假设类ChildClass是类ParentClass的派生类,下列代码就实现了父类和派生类对象之间的隐式类型转换。ParentClass[]class1_arr=newParentClass[10];ChildClass[]class2_arr=newChildClass[10];class1_arr=class2_arr;2.引用类型显式转换引用类型显式转换包括:从对象到任何引用类型的转换。从类类型S到类类型T的转换,其中S是T的基类。从基类型S到接口类型T的转换,其中S不是密封类,而且没有实现T。从接口类型S到类类型T的转换,其中T不是密封类,而且没有实现S。从接口类型S到接口类型T的转换,其中S不是T的子接口。从元素类型为Ts的数组类型S到元素类型为Tt的数组类型T的转换。引用类型不论隐式还是显式转换,虽然可能会改变引用值的类型,却不会改变值本身。Page:104.1类型转换第四章类型转换和命名空间4.1.4装箱和拆箱【学一学】通过前面的学习,我们知道数值类型之间、引用类型之间是如何进行类型转换的。如果想在值类型和引用类型之间进行转换,那么在C#中能不能完成此功能呢?答案是肯定的,这就涉及到装箱和拆箱操作。装箱和拆箱机制使得在C#类型系统中,任何值类型、引用类型之间都可以进行转换。1.装箱装箱是指将一个值类型隐式地转换成一个对象类型,或者把这个值类型转换成一个被该值类型应用的接口类型。把一个值类型的值装箱,也就是创建一个object实例并将这个值复制给这个object,例如:inti=10;objectobj=i;也可以用显式的方法来进行装箱操作,将上述代码也可以改写为:inti=10;objectobj=object(i);Page:114.1类型转换第四章类型转换和命名空间4.1.4装箱和拆箱【试一试】[任务4-1]:将一个整型变量进行装箱操作,操作完毕后改变整型变量的值,然后输出整型变量和对象变量的值;再改变对象变量的值,然后输出整型变量和对象变量的值,比较两次输出的值的变化。解决思路:1.定义一个整数变量并赋值;2.将整型变量的值赋给一个对象类型的变量;3.改变整型变量的值,并输出两变量的值;4.改变对象变量的值,并输出两变量的值。完成步骤:1.创建一个名为“Chapter4_1”的控制台应用程序。2.在Program.cs文件的主方法Main中编写如下代码:Page:124.1类型转换第四章类型转换和命名空间4.1.4装箱和拆箱staticvoidMain(string[]args){inti=50;objectobj=i;//装箱操作i=100;//改变i的值Console.WriteLine(“i={0},obj={1},i,obj);//输出两变量的值obj=200;//改变obj的值Console.WriteLine(i={0},obj={1},i,obj);}3.编译和执行程序。按“Ctrl+F5”组合健,执行程序,运行结果如图4.1所示。图4.1两次输出的变量的值Page:134.1类型转换第四章类型转换和命名空间4.1.4装箱和拆箱从图4.1可以看出:当改变i的值时,obj的值并没有变化;反之obj的值改变时,i的值也没有受到影响。所以通过装箱操作,可以把一个值类型的变量的值复制给一个对象类型的实例,而被装箱的值类型变量自身的值是不会受到装箱的影响。2.拆箱拆箱和装箱正好相反,拆箱是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口的值类型。例如:inti=20;objectobj=i;//装箱操作intj=(int)obj;//拆箱操作需要注意的是,被装箱过的对象才能被拆箱。可以看出拆箱过程正好是装箱过程的逆过程。必须注意,装箱转换和拆箱转换必须遵循类型兼容的原则。Page:144.2命名空间第四章类型转换和命名空间4.2.1命名空间的声明【学一学】C#中使用命名空间来管理和组织各种类,它是一个逻辑上的类型组织结构,利用它来对程序中的类进行逻辑上的分组,并使定义在同一命名空间中的类能相互访问。显然,在C#中可以使用命名空间来解决类的命名冲突的问题,C#中命名空间是通过关键字namespace来声明的,其语法格式如下:namespace命名空间名{……//命名空间的成员(可以是其它命名空间或定义的类)}例如在一个项目中有一个类文件MyNamesapce.cs,内容如下:namespacechapter4{classStudent{//添加Student类的成员变量和成员方法Page:154.2命名空间第四章类型转换和命名空间4.2.1命名空间的声明}classTeacher{//添加Teacher类的成员变量和成员方法}}上述代码通过关键字namespace声明了一个命名空间chapter4,注意:命名空间名要符合变量名的命名规则。在该命名空间中包含Student和Teacher两个类。现在向项目中再添加一个名为“YourNamespace.cs”的类文件,该文件的内容如下:namespacechapter4{classPerson{Studentlisi;Teacherzhangsan}}Page:164.2命名空间第四章类型转换和命名空间4.2.1命名空间的声明上述类Person用到了文件MyNamesapce.cs中的类Student和Teacher,编译程序不会产生任何问题,因为这三个类在同一命名空间chapter4中。命名空间和类一样,允许采用嵌套的结构,一个命名空间可以包含其他命名空间,形成层次式结构,以更容易分组,管理。例如有以下代码:na
本文标题:第4章 类型转换和命名空间
链接地址:https://www.777doc.com/doc-3232553 .html