值类型和引用类型到底有什么区别

程序在运行时,它的数据必须在内存中!一个数据项需要多大内存、存储在什么地方、以及如何存储都依赖于该数据项的数据类型,
运行中的程序使用两个内存区来存储数据,没错就是我们常说的“堆”和“栈”,栈是一个内存数组遵循后进先出原则,系统接管所有栈,不需要我们在做任何处理,
栈中一般存储某些类型变量的值、程序当前的执行环境、传递给方法的参数。
堆是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据,与栈不同堆里的内存可以任意顺序存入和移除,数据项的类型定义了存储数据需要的内存大小、
组成该类型的数据成员以及该类型能执行的函数,类型还决定了对象在内存中的存储位置(也就是堆和栈)

类型被分为两种:值类型和引用类型、这两种类型的对象在内存种的存储方式不同,其中值类型只需要一段单独的内存,用于存储实际的数据,而引用类型需要两段内存,
第一段存储实际的数据,它总是在堆上,第二段是引用,指向数据在堆中的存放位置;也就是说值类型存储在栈上,引用类型的引用存储可以存储在栈上也可以存储在堆上
这取决于环境,而实际数据总是存储在堆上,这里需要注意的是对于引用类型的任何对象,它所有的数据成员都存放在堆中,无论它们是值类型还是引用类型

值类型 从System.Value 派生该类型提供了与System.Object 相同的方法 但是System.ValueType 重写了 Equals 方法 能在两个对象的字段值完全匹配的前提下返回true 此外 System.ValueType 重写了GetHashCode 方法 生成哈希码时,这个重写方法所用的算法会将对象的实例字段中的值考虑在内由于这个默认实现存在性能问题,所以在自己定义值类型的时候应该重写 Equals 和 GetHashCode方法,并提供显示实现.

由于不能将值类型作为基类型来定义新的类型或者新的引用类型,所以不应在值类型中引用任何新的虚方法,任何方法都不能是抽象的,所有方法都隐式密封不能被重写

将值类型复制给另一个值类型变量会逐字段的复制,将引用类型的变量赋值给另一个引用变量的时候,符之的是内存地址
 

C#中,类型引用类型是两种不同的数据类型,它们有以下区别: 1. 存储方式: - 类型的对象直接存储在栈内存中。每个类型的变量都包含它自己的数据副本,它们的赋操作是将一个复制到另一个变量中。 - 引用类型的对象存储在堆内存中,而变量则存储在栈内存中。变量实际上只是引用对象的地址,多个变量可以引用同一个对象。 2. 内存管理: - 类型的对象由系统自动分配和释放内存,它们的生命周期与其所在的作用域相同。当变量离开作用域时,相关的内存会自动释放。 - 引用类型的对象由垃圾回收器(Garbage Collector)来管理内存。垃圾回收器会自动跟踪对象的引用并在适当的时机回收不再使用的内存。 3. 传递方式: - 类型参数在方法调用时,会将实际的进行复制,并在方法内部使用副本进行操作。对参数的修改不会影响到原始。 - 引用类型参数在方法调用时,传递的是引用的副本。方法内部对参数的修改会影响到原始对象。 4. 默认: - 类型的变量在声明时会被初始化为默认,如int类型的默认是0,bool类型的默认是false。 - 引用类型的变量在声明时会被初始化为null,表示没有引用任何对象。 5. 比较方式: - 类型的比较是按照本身进行比较,如果相等,则认为两个对象相等。 - 引用类型的比较是按照引用进行比较,只有当两个引用指向同一个对象时,才认为两个对象相等。 总结: 类型引用类型在存储方式、内存管理、传递方式、默认和比较方式等方面有一些区别。理解这些区别对于正确使用和管理不同类型的数据非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L877790502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值