《零点起飞学C#之结构.pptx》由会员分享,可在线阅读,更多相关《零点起飞学C#之结构.pptx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第9章 结 构在实际生活中,我们经常把一组相关的信息放在一起,比如通讯录的记录。这样便于我们记忆和处理。同样,编程也采纳了这种处理模式。在编程中,把一系列相关的变量组织成为一个单一实体的过程称就为生成结构的过程。这个单一实体的类型就叫做结构类型,每一个变量称为结构的成员。本章将为大家详细讲解C#语言中的结构。9.1 结 构 概 述结构和类非常相似。类类型是一种引用类型,它的变量仅仅包含访问某个数据的一个引用(或地址)。但结构是一种值类型,并且不需要堆分配。如果声明一个很大的数组,为了引用每个对象,就需要分配更多的内存。这种情况下,使用结构可以节约资源。本节学习结构的声明和它的修饰符。1结构声明
2、结构和类一样,在使用之前需要声明。声明结构需要使用struct关键字,语法如下:struct-modifiers struct identifier struct-interfaces struct-body;struct-modifiers表示结构修饰符(可选),identifier表示结构的名称,struct-interfaces表示结构的基接口等(可选),struct-body表示结构体,;(分号)是可选的。【示例9-1】下面声明名称为Str的结构。public struct Str /声明一个名为Str的结构 /结构体的代码已经省略2结构修饰符和类一样,结构也需要修饰符去限定它。不同的
3、结构,也有不同的访问权限。C#中有多种修饰符来表达结构的不同性质。结构修饰符放在struct关键字的前面,它包括new、public、protected、internal和private共5个关键字。其中,public、protected、internal和private修饰符控制结构的可访问性。它们的意义具体说明如下所示。public修饰符:表示该结构是公开的,访问不受限制。protected修饰符:表示该结构只能是本身或其派生的结构访问。internal修饰符:表示该结构只能是在当前应用程序中访问。private修饰符:表示该结构只能是本身访问。注意:new修饰符可以指定接口隐藏同名的继承
4、成员。9.2 结 构 成 员结构和类一样,它也包含多种成员,如常量、字段、方法等。具体说明如下所示:常量:用来表示常数值。字段:结构的变量。方法:是包含一系列语句的代码块,通过这些代码块能够实现预先定义的计算或操作。属性:用于访问对象或结构的特性的成员。事件:一种使对象或结构能够提供通知的成员。客户端可以通过提供事件处理程序(event handler)为相应的事件添加可执行代码。索引器:是一种含有参数的属性,又称为含参属性。它提供索引的方式来访问对象,即与数组的访问方式相同。运算符:定义表达式运算符,通过它可以对该结构的实例进行运算。实例构造函数:不使用static修饰符,用于实现初始化该结
5、构的实例所需的操作。静态构造函数:使用static修饰符,用于实现初始化该结构自身所需的操作。类型:该结构的局部类型。上述成员除了类型之外,可以分类两大类:数据成员和函数成员。其中,数据成员包括常量和字段;函数成员包括方法、属性、事件、索引器、运算符、实例构造函数和静态构造函数。注意:由于结构的成员和类的成员非常相似,因此在此不做详细介绍,读者可以参考类成员(第8.2节)。9.3 结构和类的区别结构和类虽然比较相似,但是还存在以下8个方面的区别,如下表所示。区区别项结构构类类型型值类型引用类型在内存中的分配在内存中的分配分配在堆栈上分配在堆上默默认值字段本身类型的默认值字段的默认值为null无
6、参数的构造函数无参数的构造函数不能声明可以声明析构函数析构函数不能声明可以声明实例字段的初始化例字段的初始化不能可以继承承不存在继承,但可以实现接口存在单继承实例化例化时new运算符的使用运算符的使用可以不使用,对象具有默认初始值必须使用,且要给每个字段赋初值9.3.1 继承在前面第8.1.3小节我们简单学习了类继承,但是结构不支持继承。因此,在声明结构成员时,不能使用protected或protected internal修饰符。结构类型永远不会是抽象的,并且始终是隐式密封的。因此,结构不能作为其他结构或类的基结构,而且在声明结构时,不能使用abstract或sealed修饰符。【示例9-2
7、】下面声明名称为Str的结构,它包含两个字段:name和age。其中,在声明age字段时使用了protected修饰符。public struct Str string name;protected int age;/错误,不能使用protected修饰符分析:在age的声明处将产生一个编译错误,错误信息为“结构中已声明新的保护成员”。因此,结构成员是不能用protected修饰的。结构类型隐式地从System.ValueType类继承(System.ValueType类本身继承于object类)。在声明一个结构时,可以指定该结构实现多个接口,但是不能指定基类。【示例9-3】下面声明一个类和一
8、个结构,它们的名称分别为Program和Str。其中,Str结构继承自Program类。public class Program /声明Program类public struct Str:Program /错误,Str结构不能声明基类Program string name;/声明name字段 int age;/声明age字段分析:在结构的声明处将产生一个编译错误,错误信息为“接口列表中的类型”Program”不是接口”。因为结构可以实现接口,但是不支持继承,它的函数成员也不能被继承。因此,在声明结构的函数成员时,也不能使用abstract或virtual修饰符。注意:在结构中,可以使用over
9、ride修饰符重写从System.ValueType类继承而来的方法。9.3.2 this保留字保留字this只能在实例构造函数、实例方法或实例访问器的块中使用,且表示当前实例。在类的构造函数中出现的this作为一个值类型,它表示对正在构造的对象本身的引用。在类的方法中出现的this作为一个值类型,它表示对调用该方法的对象的引用。但是,在结构的构造函数中出现的this作为一个变量类型,它表示对正在构造的结构的引用。在结构的方法中出现的this作为一个变量类型,它表示对调用该方法的结构的引用。注意:在结构中时,由于this相当于一个变量,因此,可以对this赋值,甚至通过this可能修改其所属结
10、构的值。9.3.3 构造函数在类中,可以声明无参数的实例构造函数。但是在结构中,不能声明无参数的实例构造函数。因为每一个结构都隐式地具有一个无参数实例构造函数,该构造函数无法更改。默认的构造函数将初始化该结构所有字段的值。如果字段的类型为值类型,则将该字段的值设置为其类型的默认值。如果字段的类型为引用类型,则将该字段的值设置为null。此外,结构还可以声明带有参数的实例构造函数。【示例9-4】下面程序中声明名称为Str的结构,它包含两个字段:name和age。Str结构还声明一个带有两个参数(name和age)的实例构造函数,并初始化name和age字段的值。还声明了类Program,Program类定义了一个无参数的构造函数。9.4 小 结本章主要介绍了C#语言中的结构,如结构概述、结构成员、结构和类的区别。其中,读者要着重掌握创建结构的方法,认真理解结构和类的区别,为后续编写C#程序代码奠定基础。第10章将要介绍C#语言中的数组。