《你必须知道的.NET》第五章读书笔记
了解.NET的类型很重要
.NET的主要类型分为值类型和引用类型
区分这2种类型
1、内存方面
值类型:
包括枚举enum 和结构 struct
内存分配:
实例通常分配在线程的堆栈上,并且不包括任何指向实例数据的指针,因为变量本身就包含了其实例数据,内存不由GC来控制,作用域结束时,值类型会自行释放
引用类型:
包括类,接口,数组,委托
内存分配:
实例分配在托管堆上,保存了实例数据的内存引用,由GC(Garbage Collection)来控制其回收
特殊情况:
出现嵌套的时候,即值类型嵌套引用类型,引用类型嵌套值类型,那么内存又是如何分配的呢?
值类型实例总是分配在他声明的地方,引用类型实例总是分配在托管堆上
2、sizeof()运算符用于获取值类型的大小,但是不适用于引用类型
3、值类型使用new操作符或者赋初值完成初始化,而单纯的定义没有完成初始化,此时对成员的引用将不能通过编译
4、引用类型在性能上欠于值类型
5、值类型继承自System.ValueType ,而System.ValueType 又继承自 System.Object
6、值类型是密闭的,不能作为其他类型的基类,但是可以单继承或者多继承接口,而引用类型一般有继承性
7、值类型没有多态,但是引用类型有多态
值类型和引用类型的互相转换
装箱和拆箱
按值传递和按引用传递:
按值传递
不管是引用类型按值传递还是值类型按值传递,都是在堆栈上复制一个对象的实例,将这个新的实例去传递,不改变原有实例的值。
按引用传递
是直接将指向实例的引用地址进行传递,改变了地址,则会改变参数的值
传递的是参数的地址
值类型按引用传递时实现的是对值类型参数实例的直接操作
Ref和Out均为引用传递,区别 是Ref参数传递前该参数必须已经被初始化,而out参数传递不需要
用户自定义类型转换的实现方式:
Static 访问修饰操作符 转换修饰操作符 operator 类型 (参数列表)
所有的转换都必须是static 见P160
如果声明了一个类对象指向一个托管堆地址,但是该类对象改变了引用,那么之前的地址会被GC回收
装箱和拆箱
装箱
将值类型数据转换成无类型的引用对象
过程:
1、 内存分配
2、 实例拷贝
3、 地址返回(不包含这步,但是常常伴随着一起发生)
拆箱
获取已装箱对象中来自值类型部分字段的地址,在执行上不包括字段的拷贝过程
过程:
1、 实例检查
2、 指针返回
3、 字段拷贝
遵循的规范:
1、 拆箱后必须保证执行后的结果是原来未装箱时的类型
2、 引用类型一直保持着装箱状态,装箱和拆箱是针对值类型而言的
应该尽量避免装箱拆箱的发生,可以考虑使用泛型
ArrayList,HashTable,Emun均易引起装箱
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述