C#中的值类型与引用类型
概述
Clr包括对象类型分为两种:值类型、引用类型
引用类型和值类型都可以通过new来实例化,引用类型在调用new时,clr在托管堆为实例分配内存,并将内存地址返回,而值类型再调用new时,clr在线程栈上为实例分配内存,并返回值本身。
下面从几个方面对值类型和引用类型进行对比。
值类型与引用类型对比
—- | 值类型 | 引用类型 |
---|---|---|
内存分配 | 线程栈 | 托管堆 |
内存回收 | 直接释放 | 等待垃圾回收器回收 |
new实例 | 返回值本身 | 返回内存地址,如果垃圾回收器第0代内存满时,可能引起垃圾回收 |
变量赋值 | 逐字段复制 | 赋值内存地址 |
类型特点 | 轻量、无额外字段 | 需要额外字段(类型地址指针、同步块索引) |
常见类型 | 数值类型、枚举类型、struct类型 | string、clas类 |
是否支持继承 | 值类型都是密封类型,所以不支持继承 | 单继承 |
接口实现 | 支持 | 支持 |
表现方式 | 未装箱、已装箱 | 总是已装箱 |