c#笔记-结构
装箱
结构是值类型。值类型不能继承其他类型,也不能被其他类型继承。
所以它的方法都是确定的,没有虚方法需要在运行时进行动态绑定。
值类型没有对象头,方法调用由编译器直接确定。
但是,如果使用引用类型变量(如接口或object)来存储一个值类型,
或者调用了从object类继承的方法(如ToString),那么会发生装箱。
这时,这个值类型会在堆上创建一个副本,并为它添加对象头。此时它的行为和引用类型一样。
副本
的意思是复制品。
如果把一个引用类型的值强制转换为值类型,就会去掉它的对象头,
并把内容复制到目标位置,这称为拆箱。
.Net不会记录这个装箱的数据,多次调用从object类继承的方法,
或多次赋值给不同的引用类型变量,都会重新进行装箱。
值类型直接存储自己的数据,而不是通过指针引用其他位置的数据。
值类型的位置取决于它是不是临时变量。如果它是一个方法的局部变量,
或者是另一个栈上数据的字段,那它就是在栈上的。
如果它是作为引用类型的字段,或者是已经装箱的数据,那他就在堆上。
引用类型使用的堆内存,又称为托管堆。
托管是指.Net能够管理堆内存的分配,监视,回收,释放等操作。
但这些操作都需要消耗一定的性能。
在栈上的数据都是临时的,它们的分配和使用不需要经过这么多操作。
所以未被装箱的值类型,比引用类型具有更高的性能。
结构
声明结构
结构使用struct
关键字进行声明。它不能指定基类,也不能成为基类。但结构可以实现接口。
所有以struct
声明的结构都继承自System.ValueType
类型,这是所有值类型的基类,而System.ValueType
继承自object
类型。
引用类型的直接数据只是一个指针,所以以下声明是可行的。
internal class MyClass
{public MyClass my;//但是不能写 = new MyClass()
}
而结构是直接包含数据的,所以结构不允许声明自己类型的字段(也不能用多个结构间接套娃)。
internal struct MyStruct
{public MyStruct ms;//这是错误的
}
结构初始值
结构的初始值(使用default
关键字,创建数组元素,或作为其他类型的字段)
是它所有字段都为default
的情况。它不会经过任何构造器。
如果你声明一个结构变量,但没有对它的所有字段赋值,那么你不能使用这个变量,
因为它相当于一个未赋值的局部变量。
你可以直接对这个变量赋值一个新的结构实例,
或者如果这个结构的所有字段都是public
的,那你可以逐个对它们赋值。
结构构造器
结构必须有一个无参的构造器,并且它必须是public
的。
如果你没有定义无参的构造器,编译器会自动为你添加一个。
但是如果你自己定义了无参的构造器,那么它也必须是public
的。
结构的字段初始值赋值会自动合并到你显式定义的构造器的开头。
如果你要使用初始值赋值,必须显式定义至少一个构造器。
编译器添加的无参构造器不会合并字段初始值。
相等判断
引用类型默认有一个==
运算符的重载,它比较两个对象的引用是否相同。但结构没有这样的重载,如果你想使用==
运算符,你必须自己重载它。
结构从object
类继承的Equals
方法在ValueType
类中被重写了,默认实现是利用反射
动态比较所有字段的相等性。反射是非常消耗性能的,所以强烈建议对每个自定义结构都重写Equals
方法。
不可变性
结构只能对变量进行修改。一个从方法或属性获得的结构是无法对成员进行修改的。
结构类型的只读字段也无法对值进行修改。
因此如果要改变结构类型的属性的成员,必须先用变量接收整个结构。
struct Point
{public int X;public int Y;
}class Player
{public int Hp { get; set; }public Point Point { get; set; }
}
Player player = new Player();
//player.Point.X = 60; 不能这样赋值
Point point = player.Point;
point.X = 60;
player.Point = point;
只读结构
结构可以为它的方法,属性,索引器添加readonly
修饰符。
这样的方法体中,不允许修改字段的值。
但是,如果调用了其他没有readonly
修饰符的方法,属性,索引器,
那么会在方法开头创建一个防御性副本。也就是说,要对整个结构进行一次复制操作。
使用in
参数可以创建一个引用传递参数。它可以以指针的方式访问原始数据。
但不允许对它做出修改。类似于readonly
方法,在这里面无法修改它的字段,
但如果你调用了它没有readonly
修饰符的方法,那也会创建一个防御性副本来保证原始数据不被修改。
所以,出于性能优化考虑,可以对整个结构使用readonly
修饰符。
这样,它的所有字段都必须有readonly
修饰符,而它的其他成员会视为具有readonly
修饰符。
引用传递一个只读结构将保证不会创建防御性副本。
一个指针大小在32位程序中相当于一个int,在64位程序中相当于一个long。
避免复制是针对大型结构的优化。对于没有太大复制开销的小型结构,寻址过程可能导致得不偿失。
引用结构
引用结构在结构前添加ref
修饰符,这意味着结构中可以包含引用变量字段。
引用变量是安全的托管指针,c#对它做了很多限制来保证安全。
引用变量只能存在于栈上,所以引用结构也只能存在于栈上。
为了避免引用结构出现在堆上:
- 它只能作为局部变量或其他引用结构的字段
- 它不能实现接口,因为转换为接口会导致装箱。
- 它不能赋值给
ValueType
或object
类型,也不能调用它们的方法(包括ToString
) - 不能声明引用结构的数组。
- 它不能作为泛型的类型参数
- 它不能被匿名方法或局部方法捕获
- 它不能出现在迭代器或异步方法中
相关文章:

c#笔记-结构
装箱 结构是值类型。值类型不能继承其他类型,也不能被其他类型继承。 所以它的方法都是确定的,没有虚方法需要在运行时进行动态绑定。 值类型没有对象头,方法调用由编译器直接确定。 但是,如果使用引用类型变量(如接…...

Es分布式搜索引擎
目录 一、什么是ES? 二、什么是elk? 三、什么是倒排索引? 四、正向索引和倒排索引的优缺点对比 五、mysql数据库和es的区别? 六、索引库(es中的数据库表)操作有哪些? 八、ES分片存储原理 …...

open3d 裁剪点云
目录 1. crop_point_cloud 2. crop 3. crop_mesh 1. crop_point_cloud 关键函数 chair vol.crop_point_cloud(pcd) # vol: SelectionPolygonVolume import open3d as o3dif __name__ "__main__":# 1. read pcdprint("Load a ply point cloud, crop it…...

如何对第三方相同请求进行筛选过滤
文章目录 问题背景处理思路注意事项代码实现 问题背景 公司内部多个系统共用一套用户体系库,对外(钉钉)我们是两个客户身份(这里是根据系统来的),例如当第三方服务向我们发起用户同步请求:是一个更新用户操作,它会同时发送一个 d…...

Go RPC
目录 文章目录 Go RPCHTTP RPCTCP RPCJSON RPC Go RPC Go 标准包中已经提供了对 RPC 的支持,而且支持三个级别的 RPC:TCP、HTTP、JSONRPC。但 Go 的 RPC 包是独一无二的 RPC,它和传统的 RPC 系统不同,它只支持 Go 开发的服务器与…...

真正的智能不仅仅是一个技术问题
智能并不是单一的技术问题,而是一个包括技术、人类智慧、社会制度和文化等多个方面的综合体,常常涉及技术变革、系统演变、运行方式创新、组织适应。智能是指人类的思考、判断、决策和创造等高级认知能力,可以通过技术手段来实现增强和扩展。…...

【数据结构】复杂度包装泛型
目录 1.时间和空间复杂度 1.1时间复杂度 1.2空间复杂度 2.包装类 2.1基本数据类型和对应的包装类 2.2装箱和拆箱 //阿里巴巴面试题 3.泛型 3.1擦除机制 3.2泛型的上界 1.时间和空间复杂度 1.1时间复杂度 定义:一个算法所花费的时间与其语句的执行次数成…...

Ae:绘画面板
Ae菜单:窗口/绘画 Paint 快捷键:Ctrl 8 绘画工具(画笔工具、仿制图章工具及橡皮擦工具)仅能工作在图层面板上。在使用绘画工具之前,建议先在绘画 Paint面板中查看或进行相关设置。 说明: 如果要在绘画描边…...

常见的锁和zookeeper
zookeeper 本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com 前言 只有光头才能变强。 文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/ZhongFuCheng3y/3y 上次写了一篇 什么是消息队列?以后,本来…...

经验总结:(Redis NoSQL数据库快速入门)
一、Nosql概述 为什么使用Nosql 1、单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据库就放不下了数据的索引(B Tree),一个机…...

form表单与模板引擎
文章目录 一、form表单的基本使用1、什么是表单2、表单的组成部分3、 <form>标签的属性4、表单的同步提交及缺点(1) 什么是表单的同步提交(2) 表单同步提交的缺点(3) 如何解决表单同步提交的缺点 二、…...

医院检验信息管理系统源码(云LIS系统源码)JQuery、EasyUI
云LIS系统是一种医疗实验室信息管理系统,提供全面的实验室信息管理解决方案。它的主要功能包括样本管理、检测流程管理、报告管理、质量控制、数据分析和仪器管理等。 云LIS源码技术说明: 技术架构:Asp.NET CORE 3.1 MVC SQLserver Redis等…...

React 组件
文章目录 React 组件复合组件 React 组件 本节将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 “Hello World!” 的组件,组件名为 HelloMessage: React 实例 <!DOCTYPE html> <html> <head> &…...

硕士学位论文的几种常见节奏
摘要: 本文描述硕士学位论文的几种目录结构, 特别针对机器学习方向. 1. 基础版 XX算法及其在YY中的应用 针对情况: 只有一篇小论文支撑. 第 1 章: 引言 ( > 5页) 1.1 背景及意义 (应用背景、研究意义, 2 页) 1.2 研究进展及趋势 (算法方面, 2 页) 1.3 论文结构 (1 页) 第 …...

找兄弟单词
描述 定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不…...

python字典翻转教学
目录 第1关 创建大学英语四级单词字典 第2关 合并大学英语四六级词汇字典 第3关 查单词输出中文释义 第4关 删除字典中特定字母开头的单词 第5关 单词英汉记忆训练 第1关 创建大学英语四级单词字典 本关任务:编写一个能创建大学英语四级单词字典的小程序。 测…...

sentinel 随笔 3-降级处理
0. 像喝点东西,但不知道喝什么 先来段源码,看一下 我们在dashboard 录入的降级规则,都映射到哪些字段上 package com.alibaba.csp.sentinel.slots.block.degrade;public class DegradeRule extends AbstractRule {public DegradeRule(String…...

如何解决IP能ping通但无法上网的问题?
当我们在网络环境中遇到无法上网的问题时,可能会尝试使用ping命令来测试网络连接是否正常。如果ping测试成功,说明我们的IP地址能够和网络中其他设备进行通信,但是无法上网。这种情况下,我们需要采取一些措施来解决这个问题。本文…...

Autosar实践-CANTp
文章目录 前言一、CanTp是什么?二、Autosar配置三、诊断数据传输流程1.接收单帧失败,上层没有适当的buffer2.成功接收单帧3.成功发送单帧4.成功接收多帧5.成功发送多帧前言 CANTp模块作为提供数据拆包、组包、流控制传输的服务,在Autosar基础软件通信中起着至关重要的作用。…...

Redis简介
Redis(Remote Dictionary Server)是一个开源的键值对(key-value)数据库,支持网络、可基于内存亦可持久化。 Redis的数据结构包括列表(List)、集合(Set)、有序集合&#…...

报错问题修改
Vue 项目报错:‘$‘ is not defined ( no-undef ) 错误原因是不认识 $ 符,他是 JQuery 中得符号,引入了 JQuery 文件里的函数报错onclick is not defined问题(作用域问题) window.onload function (){ onload function (){ 第二种方法…...

专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?
当前互联网流量红利已经逐渐消失,营销同质化愈发严重。在这样的背景下,催生了以为元宇宙 焦点的虚拟产业经济。元宇宙在各行各业中以不同形式快速萌生、成长,呈现出多元化的应用场景。尤其是众多品牌,将元宇宙视为品牌建设与营销新…...

加速开放计算产业化,OCTC五大原则瞄准需求痛点
回顾计算产业过去十余载的历程,开放计算始终是一个绕不开的核心焦点。 始于2011年Facebook发起的数据中心硬件开源项目--开放计算项目(简称:OCP),开放计算犹如星星之火,不仅迅速形成燎原之势,更…...

【RabbitMQ】安装及六种模式
文章目录 安装rabbitmq镜像访问容器内部15672端口映射到外面的端口地址RabbitMQ六种模式Hello world模式Work queues模式Publish/Subscribe模式交换机fanout类型 Routing模式Topics模式RPC模式 rabbitmq:0->1的学习 学习文档:https://www.cnblogs.com…...

数据结构刷题(三十一):1049. 最后一块石头的重量 II、完全背包理论、518零钱兑换II
一、1049. 最后一块石头的重量 II 1.思路:01背包问题,其中dp[j]表示容量为j的背包,最多可以背最大重量为dp[j]。 2.注意:递推公式dp[j] max(dp[j], dp[j - stones[i]] stones[i]);本题中的重量就是价值,所以第二个…...

opencv_c++学习(四)
图像在opencv中的存储方式 在上图中可以看出,在opencv中采用的是像素值来代表每一个像素三通道颜色的深浅。 Mat对象 Mat对象是在OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分࿰…...

基于AT89C51单片机的篮球计时记分设计
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87771065 源码获取 主要内容: 基于51单片机设计篮球计时计分器,结合单片机串行接口原理,用AT89C51设计一个篮球比赛计分计时器,能够通过数码管显示分数和比赛时间(并设有…...

并发编程-Day2
并发编程 1.共享模型-内存 共享变量在多线程间的<可见性>问题与多条指令执行时的<有序性>问题 1.1Java内存模型 JMM它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存CPU指令优化等. JMM体现在: 原子性-保证指令不会受到线程上…...

第1章 Nginx简介
基于 Nginx版本 1.14.2 ,Tomcat版本 9.0.0 演示 第1章 Nginx简介 1.1 Nginx发展介绍 Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。 Nginx 特点是占有内存少,并发处理能力…...

一个.Net功能强大、易于使用、跨平台开源可视化图表
可视化图表运用是非常广泛的,比如BI系统、报表统计等。但是针对桌面应用的应用,很多报表都是收费的,今天给大家推荐一个免费.Net可视化开源的项目! 项目简介 基于C#开发的功能强大、易于使用、跨平台高质量的可视化图表库&#…...