C# 图解教程 第5版 —— 第11章 结构

news/2025/2/13 3:14:44/

文章目录

    • 11.1 什么是结构
    • 11.2 结构是值类型
    • 11.3 对结构赋值
    • 11.4 构造函数和析构函数
      • 11.4.1 实例构造函数
      • 11.4.2 静态构造函数
      • 11.4.3 构造函数和析构函数小结
    • 11.5 属性和字段初始化语句
    • 11.6 结构是密封的
    • 11.7 装箱和拆箱(*)
    • 11.8 结构作为返回值和参数
    • 11.9 关于结构的更多内容

11.1 什么是结构

  • 类是引用类型,结构是值类型。
  • 结构是 隐式密封 的,不能派生。

11.2 结构是值类型

  • 结构类型的变量不能为 null。
  • 两个结构变量不能引用同一对象。
image-20231028151411869
图11.1 类与结构的内存安排

11.3 对结构赋值

​ 对结构赋值,就是复制结构的值。

image-20231028151559209
图11.2 类和结构的变量赋值

11.4 构造函数和析构函数

​ 结构可以有实例构造函数和静态构造函数,但没有析构函数。

11.4.1 实例构造函数

  • 每个结构都存在预定义的无参构造函数。在 C# 10 之前,不能删除或重定义。
  • 在 C# 11 之前,结构类型的构造函数必须初始化该类型的所有实例字段。
  • 可以创建其他的有参构造函数。
  • 仍需要使用 new 调用构造函数。
  • 可以不使用 new 创建结构实例,但是有如下限制:
    • 在设置数据成员的值后才能使用该成员。
    • 对所有数据成员赋值后才能调用函数成员。
image-20231028152004769
图11.3 不使用 new 创建结构实例的限制

11.4.2 静态构造函数

​ 结构的静态构造函数与类的静态构造函数类似。

11.4.3 构造函数和析构函数小结

表11.1 构造函数和析构函数的总结
image-20231028152414798

11.5 属性和字段初始化语句

  • 在 C# 10 之前,不允许使用实例属性和字段初始化语句。
  • 静态属性和静态字段可以进行初始化。
image-20231028153721720
图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 中实现为结构。
    • int、short、long 等
  • 类似分部类,可以声明分部结构。

http://www.ppmy.cn/news/1184600.html

相关文章

Kubernetes —集群故障排查(Kubectl 、telepresence)

一、用 Kubectl 调试 Kubernetes 节点 1、准备开始 你必须拥有一个 Kubernetes 的集群,同时你必须配置 kubectl 命令行工具与你的集群通信。 建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。 如果你还没有集群,你可以通过 Minikube 构建…

Java SE 学习笔记(十七)—— 单元测试、反射

目录 1 单元测试1.1 单元测试概述1.2 单元测试快速入门1.3 JUnit 常用注解 2 反射2.1 反射概述2.2 获取类对象2.3 获取构造器对象2.4 获取成员变量对象2.5 获取常用方法对象2.6 反射的作用2.6.1 绕过编译阶段为集合添加数据2.6.2 通用框架的底层原理 1 单元测试 1.1 单元测试概…

LS最小二乘圆拟合

1. 方式1(直接基于最小二乘的数学解析解) bool circle_LS(const vector<POINT>& points, double& center_x, double& center_y, double& radius) {center_x = 0.0;center_y = 0.0;radius = 0.0;if (points.size() < 3){return false;}double sum_x …

【多线程面试题十】、说一说notify()、notifyAll()的区别

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说notify()、notify…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

vite+vue3实现 tomcat 的本地部署

背景&#xff1a; 很多开发小伙伴在本地开发完前端项目后&#xff0c;碍于服务端环境配置麻烦&#xff0c;先本地试试部署好开发的前端项目&#xff0c;本文手把手教你如何在本地部署前端项目。 1、把项目中vite.config.js文件中的base修改为项目名称 例如&#xff1a; bas…

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档&#xff1a;《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分&#xff0c;PS即ARM&#xff0c;PL即FPGA&#xff0c;PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构&#xff0c;多核处理器常用的运行模式为AMP(非对称多处理)和…

多线程面试相关知识点

文章目录 (一) 进程线程和协程的区别创建线程的4种方式1. 继承Thread类2. 实现runnable接口3. 实现Callable接口4. 线程池创建 runnable 和 callable 有什么区别线程的 run()和 start()有什么区别&#xff1f;线程之间的状态变化notify()和 notifyAll()有什么区别&#xff1f;j…