当前位置:网站首页>CLR via C# 第五章 基元类型、引用类型和值类型
CLR via C# 第五章 基元类型、引用类型和值类型
2022-08-11 05:31:00 【canon_卡农】
一、基元类型
编译器直接支持的数据类型叫做基元类型。基元类型映射到FCL中存在的类型。
使用 checked 关键字可以在检测到溢出时抛出OverflowException异常。
二、引用类型和值类型
1.哪些是值类型,哪些是引用类型?
1.1 值类型
(1)值类型包括结构(struct)和枚举(enum)。
(2)值类型的实例一般在线程栈上分配(也可作为字段嵌入引用类型的对象中)。
(3)所有值类型都是隐式密封的(无法继承)。
(4)所有结构都从 System.ValueType(派生自 System.Object 的抽象类) 派生。
(5)所以枚举都从 System.Enum(派生自 System.ValueType的抽象类) 派生。
1.2 引用类型
(1)引用类型包括类、委托、数组和接口。
(2)引用类型在托管堆上分配内存。
2.值类型和引用类型的区别
(1)值类型实例在栈上分配内存,引用类型实例在托管堆上分配内存。
(2)值类型变量赋值时进行逐字段的复制,引用类型变量赋值时只复制内存地址。
3.什么时候使用值类型(struct)?
(1)类型具有基元类型的行为。没有成员会修改类型的任何实例字段,即类型时不可变的。
(2)类型不需要从其他任何类型继承。
(3)类型不派生出其他任何类型。
(4)类型的实例较小(<=16字节)
(5)类型的实例较大但不作为方法实参传递,也不从方法返回(使用时不需要复制)。
4.值类型的装箱和拆箱
4.1 装箱:将值类型转化为引用类型
(1)在托管堆中分配内存。分配的内存量是值类型各字段所需内存量加上类型对象指针和同步块索引所需内存量。
(2)值类型的字段复制到新分配的堆内存。
(3)返回对象地址。
4.2 拆箱:将引用类型转化为值类型(与装箱不是互逆的,拆箱是获取指针的过程,紧接着会发生一次复制)
(1)获取已装箱对象中各个字段的地址。
(2)将字段包含的值从堆内存复制到栈上。
边栏推荐
猜你喜欢
随机推荐
Day 81
2022DASCTF X SU 三月春季挑战赛 checkin ROPgadget进阶使用
JS case exercise (classic case of teacher pink)
C-8月1日-递归与动态内存管理
微信小程序_开发工具的安装
连接数据库时出现WARN: Establishing SSL connection without server‘s identity verification is not recommended.
5月leetcode-C#刷题日志(持续更新中)
Day 73
IIC and SPI
Compilation exception resolution
Day 86
C language implementation guess Numbers (with source code, can be directly run)
Getting Started with JNI
JS事件循环机制
自己动手写RISC-V的C编译器-01实现加减法
Intelligent risk control China design and fall to the ground
Open Source Machine Learning Database OpenMLDB Contributor Program Fully Launched
[Meetup Preview] OpenMLDB+OneFlow: Link feature engineering to model training to accelerate machine learning model development
【LeetCode-147】对链表进行插入排序
JS this关键字