C# 中的基元类型、引用类型和值类型

一、基元类型

编译器直接支持的数据类型叫做基元类型。基元类型映射到FCL中存在的类型。

C#基元类型FCL类型说明
sbyteSystem.SByte有符号8位值
byteSystem.Byte无符号8位值
shortSystem.Int16有符号16位值
ushortSystem.UInt16无符号16位值
intSystem.Int32有符号32位值
uintSystem.UInt32无符号32位值
longSystem.Int64有符号64位值
ulongSystem.Uint64无符号64位值
charSystem.Char16位Unicode字符(C++中是8位)
floatSystem.SingleIEEE32位浮点值
doubleSystem.DoubleIEEE64位浮点值
boolSystem.Booleantrue / false值
decimalSystem.Decimal128位高精度浮点值(常用于金融计算)
stringSystem.String字符数组
objectSystem.Object所有类型的基类型
dynamicSystem.Object对于CLR等同于object。但C#编译器允许使用简单的语法让dynamic变量参与动态调度

二、引用类型和值类型

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)将字段包含的值从堆内存复制到栈上。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值