




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022年3月5日第8章 理解值和引用理解值和引用 主讲教师: 杨建军教学目标 本章主要介绍值类型(结构类型、枚举类型)、引用类型(数组、接口类型、委派类型)、装箱与拆箱、类型和别名、类型之间的转换、CTS优点等知识。通过本章的学习我们将知道.NET框架的核心是一个公共类型系统(Common Type System,CTS)。.NET的类型是如何转换的 教学重点lSystem.Object类l默认构造函数l结构类型、枚举类型l数组、接口类型、委派类型l装箱与拆箱l类型和别名、类型之间的转换lCTS的优点8.1 一切都是对象一切都是对象 在.NET和C#世界中,所有的对象都是从一个基类中隐性派生
2、出来的,这个类就是“System.Object”类。 8.2 值类型值类型 值类型包括基本类型、结构类型和枚举类型。所有值类型都隐式地从类object继承。任何类型都不可能从值类型派生,因此隐式地将值类型密封。值类型的变量总是包含此类型的值,值类型的值不可能为null。值类型变量的赋值会创建所赋值的副本。 8.2.1默认构造函数默认构造函数 所有值类型都隐式声明一个称为默认构造函数的公共无参数实例构造函数。默认构造函数返回一个称为值类型的默认值的零初始化实例。值类型的默认值如表8-1所示。 8.2.2 结构类型结构类型 结构类型是可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静
3、态构造函数和嵌套类型的值类型。 1. 定义结构定义结构结构的定义需使用struct关键字,定义格式如下:struct 结构类型名称 类型名称1 结构成员名称1; 类型名称2 结构成员名称2; .8.2.2 结构类型结构类型 2. 声明结构变量声明结构变量 定义结构后,一个新的数据类型就产生了,可以像使用基本数据类型那样,用结构来声明变量。 3. 访问结构变量访问结构变量 使用结构中的成员必须指出访问的结构变量。方法是在结构变量和成员之间通过运算符“”连接在一起。即: 结构变量名.成员名8.2.3 枚举类型枚举类型 1. 定义枚举类型定义枚举类型 定义枚举类型使用关键字enum,定义枚举类型的一
4、般格式为: enum 枚举类型名称 符号常量1, 符号常量2, 8.2.3 枚举类型枚举类型 枚举常量成员的默认值为0、1、2,可以在定义枚举类型时为成员赋予特定的整数值,例如: enum SolarSystem Sun=700000, / 太阳半径 Earth=6380, / 地球赤道半径 Moon=1740 / 月亮半径 8.2.3 枚举类型枚举类型 2. 声明与访问枚举变量声明与访问枚举变量 声明枚举变量与声明基本类型变量的格式相同: SolarSystem s; / 声明一个枚举变量s 可以在声明枚举变量的同时为变量赋值,枚举变量的值,必须是枚举成员,枚举成员需要用枚举类型引导,例如:
5、 SolarSystem s= SolarSystem.Sun; 8.3 引用类型引用类型 引用类型是是字符串类型、数组类型、对象类型、类类型、接口类型或委托类型。引用类型的值是对该类型实例的引用,后者称为对象。特殊值null与所有引用类型兼容,它指示没有实例。 8.3.1对象类型对象类型 object类型表示对象类型,是所有其它联系的基类。C#中的每一种类型都是直接或间接地从object类型派生的。 object关键字是System.Object类型的别名。object类型的变量以32位的地址形式存储,此地址为对象引用。可以为声明为object类型的变量分配任何引用类型(字符串、数组、类或接
6、口)。object类型的变量还可以引用任何值类型的数据(简单类型、结构类型或枚举类型)。也就是说object类型变量可以接受任何数据类型的值。 8.3.2 数组数组 1. 数组概述数组概述 数组是具有相同类型的一批数据按一定顺序组成的序列,数组中的每一个数据都可以通过数组名及唯一一个索引号(下标)来存取。所以,数组用于存储和表示既与取值有关,又与位置(顺序)有关的数据。 由具有一个下标的下标变量所组成的数组称为一维数组。而由具有两个或多个下标的下标变量所组成的数组称为二维数组或多维数组,多维数组元素的下标之间用逗号分隔,如A0,1表示是一个二维数组中的元素。 8.3.2 数组数组 2. 声明与
7、访问一维数组声明与访问一维数组 声明数组的过程包含两个环节,即声明数组变量与数组变量的实例化。声明一维数组的格式为: 访问修饰符访问修饰符 类型名称类型名称 数组名数组名;例如:int A;数组在声明后必须实例化才可以使用。实例化数组的格式为:数组名称数组名称 = new 类型名称类型名称无符号整型表达式无符号整型表达式;例如:A=new int6;8.3.2 数组数组 数组在实例化时,可以为元素指定初始化值,其格式为:数组名称数组名称 = new 类型名称类型名称无符号整型表达无符号整型表达式式值值1,值值2;例如:int A= new int51,2,3,4,5,6;8.3.2 数组数组
8、3. 声明多维数组声明多维数组 在多维数组中,比较常用的是二维数组,声明二维数组与声在多维数组中,比较常用的是二维数组,声明二维数组与声明一维数组格式类似,例如:明一维数组格式类似,例如: / 声明并实例化一个两行两列的二维数组声明并实例化一个两行两列的二维数组int , A=new int2,21,2,3,4; 声明多维数组时,用逗号表示维数,一个逗号表示二维数组,声明多维数组时,用逗号表示维数,一个逗号表示二维数组,两个逗号表示三维数组,依次类推。两个逗号表示三维数组,依次类推。 访问多维数组需要用多个下标唯一确定数组中某个元素,例访问多维数组需要用多个下标唯一确定数组中某个元素,例如:如
9、:/ 声明一个声明一个4行行4列的二维数组列的二维数组int , A=new int4,4; A1,2=15; / 为第为第2行第行第3列的元素赋值列的元素赋值8.3.2 数组数组 4.声明数组列表(声明数组列表(ArrayList) ArrayList叫数组列表,数组列表是一个集合类,由该类声明的对象可以当做数组来使用。ArrayList类属于System.Collections命名空间,所以声明ArrayList类对象必须引用该命名空间,在Visual Sdudio.Net 2005中则需要手动添加对该命名空间的引用。 如果在声明ArrayList类对象时,想使该对象具有数组那样所包含的元
10、素个数,可以用一个已经实例化的数组来初始化,其格式为: ArrayList 名称=new ArrayList(数组名称); 其中,“数组名称”为已经实例化的数组。8.3.2 数组数组 5.声明控件数组声明控件数组 创建一个Windows应用程序项目,在窗体上添加4个文本框。在Form1类定义中声明文本框数组字段代码:private System.Windows.Forms.TextBox textB;对该数组实例化。窗体的Load事件代码为:private void Form1_Load (object sender, System.EventArgs e)/ 实例化并指定各元素值 textB
11、=new TextBox textBox1,textBox2,textBox3,textBox4; 8.3.2 数组数组 6. 数组与数组列表的属性与方法数组与数组列表的属性与方法(1)常用的属性Length属性表示数组包含多少个元素。在数组列表中,表示包含元素个数的属性为Count,其性质与用法与数组的Length属性相同。IsReadOnly属性数组与数组列表均具有IsReadOnly属性,该属性可判断数组或数组列表中的元素是否为只读的。8.3.2 数组数组 Clone方法的使用格式如下:目标数组名称=(数组类型名称)源数组名称.Clone( );CopyTo方法的使用格式如下:源数组名称
12、.CopyTo(目标数组名称,起始位置);Sort方法可以将数组中的元素按升序排列。数组与数组列表都具有Sort方法,但使用的格式不同。数组的Sort方法使用格式为: Array.Sort(数组名称);8.3.3 类类型类类型 类类型定义一种数据结构,它包含数据成员(常数和字段)、函数成员(方法、属性、事件、索引器、运算符、实例构造函数、析构函数和静态构造函数)和嵌套类型。C#的类类型支持单继承。有关类的具体内容在后续章节中介绍。 8.3.4 接口类型接口类型 1. 接口的声明接口的声明接口的声明格式:接口修饰符 interface 接口名 返回类型 方法名1(参数表); 返回类型 方法名2(
13、参数表); 返回类型 方法名3(参数表); 8.3.4 接口类型接口类型 2.接口的实现接口的实现 为了实现一个接口,需要声明一个class或struct,让它们从接口继承,然后实现所有的接口方法。实现接口的类或结构必须包含该接口的所有成员的执行代码,且必须匹配指定的签名(包括匹配指定的get和set块),并且必须是公共的。 如果实现接口的类是基类,也可以使用virtual或abstract来执行接口成员,而在派生类中编写具体的执行代码。如果是派生类实现接口,也可以由基类实现接口成员。 8.3.5 委派类型委派类型 委派是C#的一种数据结构,该数据结构引用一个静态方法,或引用一个对象实例和该对
14、象的实例方法。委派是面向对象的,类型安全并且可靠。在程序运行中,同一个委派能够用来调用不在程序运行中,同一个委派能够用来调用不同的方法,只要改变它引用的方法就好。因同的方法,只要改变它引用的方法就好。因此,委派调用的方法不是在编译时决定的,此,委派调用的方法不是在编译时决定的,而是在运行时决定。这就是委派的主要优点。而是在运行时决定。这就是委派的主要优点。 8.3.5 委派类型委派类型 委派声明的语法为:委派声明的语法为: 委派修饰符委派修饰符 delegate 结果类型结果类型 委派名委派名(参数参数列表列表); 委派修饰符可以是委派修饰符可以是new、public、protected、in
15、ternal、private;结果类型;结果类型必须与方法的返回类型相同。必须与方法的返回类型相同。 委派使方法可以作为参数传递。委派的类型委派使方法可以作为参数传递。委派的类型安全要求作为委派传递的方法拥有同委派声安全要求作为委派传递的方法拥有同委派声明相同的签名。明相同的签名。8.4 装箱与拆箱装箱与拆箱 装箱:把值类型转换为引用类型,通俗点说,就装箱:把值类型转换为引用类型,通俗点说,就是把预定义类型的变量变为一个是把预定义类型的变量变为一个object类型的对类型的对象。象。 拆箱:把引用类型还原为相应的值类型,即封箱拆箱:把引用类型还原为相应的值类型,即封箱的逆过程。的逆过程。 in
16、t i = 20; object o = i; /封箱封箱 int j = (int)o; /拆箱拆箱 拆箱时,必须保证值变量有足够空间保存引用变拆箱时,必须保证值变量有足够空间保存引用变量,否则运行时会抛出异常。量,否则运行时会抛出异常。 8.5 System.Object类类 所有的类型最终都是从所有的类型最终都是从System.Object类类型中派生出来的,这就保证了系统中的每一型中派生出来的,这就保证了系统中的每一种类型都至少有一套公共的功能。所有类型种类型都至少有一套公共的功能。所有类型都使用的都使用的4个公共方法如表个公共方法如表8-2所示。所示。 8.6 类型和别名类型和别名
17、CTS负责定义可在负责定义可在.NET各种语言中使用的各种语言中使用的类型,大多数语言就选择了实现这些类型的类型,大多数语言就选择了实现这些类型的别名。别名。C#类型名和类型名和CTS类型名之间的对应类型名之间的对应关系如表关系如表8-4所示。所示。 8.6 类型和别名类型和别名 CTS负责定义可在负责定义可在.NET各种语言中使用的各种语言中使用的类型,大多数语言就选择了实现这些类型的类型,大多数语言就选择了实现这些类型的别名。别名。C#类型名和类型名和CTS类型名之间的对应类型名之间的对应关系如表关系如表8-4所示。所示。 8.7 类型之间的转换类型之间的转换 在程序的设计中,常常会遇到变
18、量的类型转换问在程序的设计中,常常会遇到变量的类型转换问题。比如在进行数学四则运算时,题。比如在进行数学四则运算时,int类型的数值类型的数值和和double类型的数值可能混在一起进行运算,这类型的数值可能混在一起进行运算,这样变量之间的类型转换就应运而生。经常使用的样变量之间的类型转换就应运而生。经常使用的类型转换方法有:类型转换方法有:l隐式转换隐式转换l强制类型转换强制类型转换lToString()方法()方法lConvert类类 8.7.1 类型转换类型转换 隐式类型转换:从类型隐式类型转换:从类型A到类型到类型B的转换由编译器的转换由编译器自动完成。隐式转换又称自动类型转换,若两种自
19、动完成。隐式转换又称自动类型转换,若两种变量的类型是兼容的或者目标类型的取值范围大变量的类型是兼容的或者目标类型的取值范围大于源类型时就可以使用隐式转换。能够安全进行于源类型时就可以使用隐式转换。能够安全进行隐式类型转换如表隐式类型转换如表8-5所示。所示。 强制类型转换:又叫显式类型转换,从类型A到类型B的转换只能在某些特定情况下进行,转换的规则比较复杂,应该进行某种类型的处理。强制转换的缺点是可能产生的结果不够精确。具体的强制类型转换语法为: (目标类型)变量或表达式; 8.7.1 类型转换类型转换 ToString()方法主要用于将变量转化为字符串类型,该方法是C#语言中非常常见的一个方法。 各种类型的变量都可以通过ToString()方法转换为String类型,具体看下面一个把int型变量转化为string类型的小例子: int i=600; string s=i.ToString(); 这样字符串类型变量s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论