第8章 结构体:更为复杂的数据类型

结构体struct)由一组数据变量或数据值组成,这些数据变量和数据值组合存放在单一的内存块中。鉴于数据结构通常是某种由彼此相关的对象组成的数据集,因此结构体也被认为是一种数据结构,但其实它更像是一种复杂的数据类型。这个定义听起来比较简单,但不要被表象所欺骗。结构体这个知识实际上非常复杂,本书所用的4种开发语言都对结构体的支持有其独特之处。

本章将涵盖以下主要内容:

  • 结构体的定义;
  • 结构体的创建;
  • 常见的结构体应用;
  • 每种开发语言中的结构体示例;
  • 枚举类型。

由于开发语言对结构体的支持不尽相同,本章我们将通过另一种形式对结构体进行讲解。我们将对结构体进行研究,并同时在每一种开发语言中进行案例学习,而不是将结构体作为一个整体放在同一个案例中进行学习。这将使我们有机会在适当的情况下研究结构体在不同开发语言中的细微差别。

在C#中,结构体被定义为一种值类型,用来对一小组相互关联的字段进行封装,这与C语言中结构体的底层实现非常类似。然而在实际中,与C中的结构体相比,C#的结构体更像是一种通常意义上的类,两者完全不同。比如,我们可以在C#的结构体中定义方法、字段、属性、常量、索引器、运算符方法、嵌套类型、事件以及构造函数(不是自动定义的默认构造函数),还可以实现一个或多个接口,所有这些都使C#具有比C更高的灵活性。

然而,我们并不能把结构体当作一种轻量级的类。C#的结构体不支持继承,也就是说它们不能从已有的类和其他结构体继承而来,也不能派生出其他结构体和类。结构体的成员不能声明为抽象、保护或虚拟类型。与类不同的是,结构体可不用new关键字来进行实例化,这样做会使该结构体在它所有字段未完成赋值之前不可用。最后,也可能是最重要的一点,结构体是一种值类型,而类是引用类型。 ...

Get 程序员学数据结构 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.