.NET值类型和引用类型的区别

开发工具与关键技术:Visual Studio
撰写时间:2019年08月08日

一、如果数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。“引用类型”包含指向存储数据的其他内存位置的指针
1.值类型包括所有数字类型(Boolean、Char、Date)、所有结构,即使成员是引用类型枚举,因为其基础类型总是(Short、Integer、Long、Byte、)
2.引用类型包括String,所有数组,即使元素是值类型,类类型,如Form、委托
二、.NET中的值类型和引用类型
在学习过程中,我的老师给了我们一道题目:值类型(Value Type)和引用类型(Reference Type)的区别
然后我们就去网上找答案,总结了一下:

值类型引用类型
创建位置托管堆
赋值时复制值复制引用
内存分布连续分散
动态内存分配需要分配内存

引用类型:
一个引用类型的堆内存包含一下几个部分:
1.同步块索引,8个字节,用于保存大量与CLR相关的元数据,一下基本操作都会用到该内存:
(1)线程同步(lock)
(2)垃圾回收(GC)
(3)哈希值(HashCode)
2.方法表指针又叫类型对象指针,8个字节,用来指向类的方法表;
3.实例成员,8字节对齐,没有任何成员时也需要8个字节
4.因为没有同步块索引,导致:
(1)值类型不能参与线程同步(lock)
(2)值类型不需要进行垃圾回收(GC)
(3)值类型的哈希值计算过程与引用类型不同(HashCode)
5.因为没有方法表指针,导致:值类型不能继承
值类型:
1.值类型赋值时是复制值,而不是复制引用
2.指针和引用类型的引用都指向真是的对象内存位置
3.值类型一般在涉及底层时使用,性能关键型的服务器、游戏引擎等等,都需要关心内存分配,都需要使用值类型

三、两者区别:
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用变量的赋值只复制对对象的引用,而不复制对象本身
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自System.ValueType.但与类型相同的是,结构也可以实现接口。
3.值类型不可能包含null值;然后,可空类型功能允许将null赋给值类型。
4.每种值类型均有一个隐式的默认就将构造函数来初始化该类型的默认值
5.值类型通常被分配在栈上,它的变量直接包含变量的实例,使用效率比较高
6.值类型继承ValueType(注意:而Sysytem.ValueType又继承自System.Object)
而引用类型继承自System.Object
7.引用类型分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例
8.值类型有两种表示:装箱与拆箱;引用类型只有装箱一种形式
9.典型的值类型为:struct、enum以及大量的内置值类型;而不能成为类的都可以说是引用类型
10.值类型不具有多态性;而引用类型有多态性
11.值类型是密封的(sealed),因此值类型不能作为其他任何类型的积累,但是可以单继承或多继承接口;而引用类型一般都有继承性
12.值类型有两种状态:装箱和未装箱,运行库提供了所有值类型的已装形式;而引用类型通常只有一种形式:装箱

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值