C#中的值类型与引用类型

C#中的值类型与引用类型

概述

Clr包括对象类型分为两种:值类型、引用类型
引用类型和值类型都可以通过new来实例化,引用类型在调用new时,clr在托管堆为实例分配内存,并将内存地址返回,而值类型再调用new时,clr在线程栈上为实例分配内存,并返回值本身。
下面从几个方面对值类型和引用类型进行对比。

值类型与引用类型对比

—- 值类型 引用类型
内存分配 线程栈 托管堆
内存回收 直接释放 等待垃圾回收器回收
new实例 返回值本身 返回内存地址,如果垃圾回收器第0代内存满时,可能引起垃圾回收
变量赋值 逐字段复制 赋值内存地址
类型特点 轻量、无额外字段 需要额外字段(类型地址指针、同步块索引)
常见类型 数值类型、枚举类型、struct类型 string、clas类
是否支持继承 值类型都是密封类型,所以不支持继承 单继承
接口实现 支持 支持
表现方式 未装箱、已装箱 总是已装箱