12. 结构
来源:互联网 发布:淘宝拍a发b平台赚钱 编辑:程序博客网 时间:2024/04/30 10:02
12.1 什么是结构
结构是程序员定义的数据类型,非常类似于类。它们有数据成员和函数成员。虽然与类相似,但是有许多重要的区别。最重要的区别是:
- 类是引用类型而结构是值类型。
- 结构是隐式密封的,这意味着它们不能被派生。
声明结构的语法与声明类相似
struct StructName{MemberDeclarations}
12.2 结构是值类型
和所有值类型一样,结构类型变量含有它自己的数据。从而:
12.3 对结构赋值
- 结构类型的变量不能为null。
- 两个结构变量不能引用同一对象。
把一个结构赋值给另一个结构,就是从一个结构中把值复制到另一个结构。这和复制类变量不同,复制类变量时只有引用被复制。
12.4 构造函数和析构函数
结构可以有实例构造函数和静态构造函数,但不允许有析构函数。
实例构造函数
语言隐式地为每个结构提供一个无参数的构造函数。这个构造函数把结构的每个成员设置为该类型的默认值。值成员被设置成它们的默认值,引用成员被设置成ull。
预定义的无参数构造函数对每个结构都存在,而不且能删除或重定义它。但是,可以创建另外的构造函数,只要它们有参数。注意,这和类不同。对于类,编译器只在没有其他构造函数声明时提供隐式的无参数构造函数。
要调用一个构造函数,包括隐式无参数构造函数,要使用new运算符。注意,即使不从堆中分配也使用new运算符。
也可以不使用new运算符创建结构的实例。然而,如果这样做,有一些限制,它们如下:
- 不能使用数据成员的值,直到显式地设置它。
- 不能调用任何函数成员,直到所有数据成员已经被赋值。
静态构造函数
构造函数和析构函数的总结就像类,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。结构的静态构造函数遵从与类的静态构造函数一样的规则。
静态构造函数在下面两个行为的第一个之前被调用:
- 调用显式声明的构造函数。
- 对结构静态成员的引用。
构造函数和析构函数的总结 类型 描述 实例构造函数(无参数)不能在程序中声明。系统为所有结构提供一个隐式的构造函数。
它不能被程序删除或重定义实例构造函数(有参数)可以在程序中声明静态构造函数可以在程序中声明析构函数不能在程序中声明。析构函数不被允许。
12.5 字段初始化是不允许的
在结构中字段初始化是不允许的。
12.7 装箱和取消装箱结构总是隐式密封的,因此,不能从它们派生其他结构。
由于结构不支持继承,个别类成员修饰符用在结构成员上就没有意义。因而,它们不能被用在结构成员声明中。不能用于结构的修饰符如下:
- protected
- internal
- abstract
- virtual
结构本身派生自System.ValueType,System.ValueType派生自Object。两个可以用于结构成员的继承相关的关键字是new和override修饰符,当创建一个和基类System.ValueType的成员有相同名称的成员时使用它们。所有结构都派生自System.ValueType。
12.8 结构作为返回类型和参数如同其他值类型,如果想使用一个结构实例作为引用类型对象,必须执行装箱(Boxing)的复制。
结构可以用作返回值和参数。
- 返回值:当结构被作为返回值时,一个拷贝被创建并从函数成员返回。
- 值参:当结构被用作值参时,一个实际参数的拷贝被创建。该拷贝被用在方法的执行中。
- ref和out参数:如果把一个结构用作ref或out参数,一个对该结构的引用被传入方法,这样其数据成员就能被改变。
12.9 关于结构的附加信息
分配结构与创建类的实例需要更少的消耗,所以使用结构代替类有时可以提高性能,但要注意到装箱和取消装箱的高代价。
最后,关于结构,需要知道的最后一些事情如下:
- 预定义简单类型(int、short、long,等等),尽管在.NET和C#中被视为原始类型,它们实际上在.NET中都被实现为结构。
- 可以使用声明partial类相同的方法声明partial 结构。
- 结构,就像类,可以实现接口。