11.1 什么是结构
- 类是引用类型,结构是值类型。
- 结构是 隐式密封 的,不能派生。
11.2 结构是值类型
- 结构类型的变量不能为 null。
- 两个结构变量不能引用同一对象。
图11.1 类与结构的内存安排
对结构赋值,就是复制结构的值。
图11.2 类和结构的变量赋值
11.4 构造函数和析构函数
结构可以有实例构造函数和静态构造函数,但没有析构函数。
11.4.1 实例构造函数
- 每个结构都存在预定义的无参构造函数。在 C# 10 之前,不能删除或重定义。
- 在 C# 11 之前,结构类型的构造函数必须初始化该类型的所有实例字段。
- 可以创建其他的有参构造函数。
- 仍需要使用 new 调用构造函数。
- 可以不使用 new 创建结构实例,但是有如下限制:
- 在设置数据成员的值后才能使用该成员。
- 对所有数据成员赋值后才能调用函数成员。
图11.3 不使用 new 创建结构实例的限制
11.4.2 静态构造函数
结构的静态构造函数与类的静态构造函数类似。
11.4.3 构造函数和析构函数小结
表11.1 构造函数和析构函数的总结
11.5 属性和字段初始化语句
- 在 C# 10 之前,不允许使用实例属性和字段初始化语句。
- 静态属性和静态字段可以进行初始化。
图11.4 C# 10 之前不允许使用实例属性和字段初始化语句
11.6 结构是密封的
由于结构不支持继承,因此下面的修饰符不能用于结构:
- protected
- protected internal
- abstract
- sealed
- virtual
由于结构本身派生自 System.ValueType(System.ValueType 派生自 object),因此可以使用 new 和 override 去覆盖或重定向 System.ValueType 中同名的成员。
11.7 装箱和拆箱(*)
11.8 结构作为返回值和参数
- 将结构作为返回值或值参数时,均会创建副本。
- 使用 ref 或 out 参数时,将会传递结构的引用以修改其内容。
11.9 关于结构的更多内容
- 对结构进行分配的开销比类小,可以提高性能。
- 预定义简单类型尽管被视为原始类型,但在 .NET 中实现为结构。
- 类似分部类,可以声明分部结构。