文章目录
11.1 什么是结构
- 类是引用类型,结构是值类型。
- 结构是 隐式密封 的,不能派生。
11.2 结构是值类型
- 结构类型的变量不能为 null。
- 两个结构变量不能引用同一对象。
![image-20231028151411869](https://i-blog.csdnimg.cn/blog_migrate/a348c97b2ff677f7cc58404a3cc2896f.png#pic_center)
11.3 对结构赋值
对结构赋值,就是复制结构的值。
![image-20231028151559209](https://i-blog.csdnimg.cn/blog_migrate/3069a89727b6b25bf28911225cf4b4db.png#pic_center)
11.4 构造函数和析构函数
结构可以有实例构造函数和静态构造函数,但没有析构函数。
11.4.1 实例构造函数
- 每个结构都存在预定义的无参构造函数。在 C# 10 之前,不能删除或重定义。
- 在 C# 11 之前,结构类型的构造函数必须初始化该类型的所有实例字段。
- 可以创建其他的有参构造函数。
- 仍需要使用 new 调用构造函数。
- 可以不使用 new 创建结构实例,但是有如下限制:
- 在设置数据成员的值后才能使用该成员。
- 对所有数据成员赋值后才能调用函数成员。
![image-20231028152004769](https://i-blog.csdnimg.cn/blog_migrate/b12eb8d304eb86700a9104af93db0aef.png#pic_center)
11.4.2 静态构造函数
结构的静态构造函数与类的静态构造函数类似。
11.4.3 构造函数和析构函数小结
![image-20231028152414798](https://i-blog.csdnimg.cn/blog_migrate/d93a6f95d5f2cd4d834d8f488e40d9f5.png#pic_center)
11.5 属性和字段初始化语句
- 在 C# 10 之前,不允许使用实例属性和字段初始化语句。
- 静态属性和静态字段可以进行初始化。
![image-20231028153721720](https://i-blog.csdnimg.cn/blog_migrate/b70b1b03ceaef4bd0965e868366e30ff.png#pic_center)
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 中实现为结构。
- int、short、long 等
- 类似分部类,可以声明分部结构。