值类型和引用类型的区别

一、简述
值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。
值类型(value type):byte、short、int、long、float、double、decimal、char、bool 、 struct、enum 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
引用类型(reference type):string 、 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
二、区别
1、不同的存储对象:
值类型变量存储的是变量的值,直接储存在栈内存中。
引用类型变量存储的是变量所在的内存地址,引用类型变量的实际数据存储于托管堆,变量本身仅仅是一个指向堆中实际数据的地址,存储于栈内存中,通常是四个字节。
2、不同的存储位置:
值类型Value存储在线程堆栈中。
引用类型Reference存储在托管堆上。
栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放
3、不同的类型:
这里类型区分的对象是C#中内建的类型Type和用户自定义的类型。
C#中的值类型:C#有15个预定义类型,其中13个是值类型,两个是引用类型(string和object)。
在这里插入图片描述
4、不同表现:
值类型赋值是重新创建一个副本,修改之后互相之间没有影响。
而引用类型的赋值是共享同一块内存(副本),是指向同一块内存(引用类型的名字相当于指向操作)。只是复制引用而不复制被引用识别的对象。修改之后互相之间是有影响的。
三、适用场合
值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
满足一下条件优先使用值类型
1、当类型是一个十分简单的类型,其中没有成员会修改类型的任何实例字段。
2、类型不需要从其他任何类型继承。
3、类型不会派生出其他任何类型(引用类型可以派生出新的类型,而值类型不能,因为所有的值类型都是密封(seal)的)。
4、类型的实例较小。
5、类型不作为方法参数传递,也不作为方法的返回类型使用。
6、引用类型可以包含null值,值类型不能(可空类型功能允许将null赋给值类型)。

参考:
https://www.cnblogs.com/Christal-R/p/7400332.html
https://www.jianshu.com/p/2d27b06e253f

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值