猿问

引用类型和值类型在c#中有什么区别?

引用类型和值类型在c#中有什么区别?

几个月前有人问我这个问题,我无法详细解释。在C#中,引用类型和值类型之间有什么区别?

我知道值类型是intboolfloat,等等和引用类型是delegateinterface等或者这也是错的?

你能用专业的方式向我解释一下吗?


长风秋雁
浏览 549回答 4
4回答

慕码人8056858

你的例子有点奇怪,因为int, bool和float是特定类型,接口和委托是种类类型-就像struct和enum是各种价值类型。我写过阿参考类型和价值类型的解释在本文中..我很乐意对你认为令人困惑的任何细节进行扩充。“TL;DR”版本是考虑特定类型的变量/表达式的值。对于值类型,值是信息本身。对于引用类型,该值可以是空引用,也可以是导航到包含信息的对象的一种方法。例如,把变量想象成一张纸。它可能有“5”或“假”的价值,但它不可能有我的房子.它必须有方向去我家。这些指示相当于参考。特别是,两个人可以有不同的纸,里面有相同的方向到我的房子-如果有一个人遵循这些方向,把我的房子涂成红色,那么第二个人也会看到这种变化。如果他们俩都分开图片我的房子在纸上,然后一个人给他们的纸上色,根本不会改变另一个人的纸。

萧十郎

价值类型:保存一些值而不是内存地址例子:结构储存:TL;DR:变量的值存储在被销毁的任何地方。例如,局部变量存在于堆栈中,但当作为成员在类中声明时,它会与声明在其中的类紧密耦合在堆上。更长: 因此,值类型存储在声明它们的任何位置。例如:int函数中作为局部变量的值将存储在堆栈中,而int类中声明为成员的值将与类中声明的类一起存储在堆中。类上的值类型具有与其声明的类完全相同的生命类型,几乎不需要垃圾收集器工作。深度C#“或他的文章”.NET中的内存“为了更简洁的解释。优势:值类型不需要额外的垃圾收集。它与它所在的实例一起收集垃圾。方法中的局部变量在方法离开时被清除。缺点:当大量值传递给方法时,接收变量实际上是复制的,因此内存中有两个冗余值。因为课程被漏掉了,失去了所有的OOP利益参考类型:持有值而非值的内存地址。例子:班级,等级储存:储存在堆上优势:当将引用变量传递给方法时,它确实会更改原始值,而在值类型中,则会获取给定变量的副本,而该值将被更改。当变量的大小较大时,参考类型是好的。当类作为引用类型变量出现时,它们提供了可重用性,从而有利于面向对象的编程。缺点:在分配时引用更多的工作,在读取值时取消引用。垃圾收集器的额外重载

猛跑小猪

我发现,如果你知道计算机如何在内存中分配东西,并且知道指针是什么,就更容易理解两者的区别。引用通常与指针相关联。意味着您的变量所在的内存地址实际上持有另一个内存地址在不同的内存位置中的实际对象。我要给出的例子过于简单化了,所以就拿这个例子来说吧。假设计算机内存是一行中的一堆PO框(从w/POBox 0001到POBox n),它们可以在其中容纳一些东西。如果PO框不适合您,请尝试一个哈希表、字典、数组或类似的东西。因此,当你做以下事情时:变量a=“Hello”;计算机将执行以下操作:分配内存(例如从内存位置1000开始,5字节),并将H(在1000),e(在1001),l(在1002),l(在1003)和o(在1004)。在内存中的某个位置分配(例如在位置0500),并将其赋值为变量a。所以有点像化名(0500是a)。将该内存位置(0500)的值赋给1000(这是字符串Hello在内存中开始的位置)。因此,变量a持有参照系到“Hello”字符串的实际启动内存位置。值类型将在其内存位置保存实际的东西。因此,当你做以下事情时:变量a=1;计算机将执行以下操作:分配一个内存位置,例如0500,并将其分配给变量a(相同的别名)将值1放入其中(在内存位置0500)。注意,我们没有分配额外的内存来保存实际值(1)。因此,a实际上持有实际价值这就是为什么它被称为价值类型。
随时随地看视频慕课网APP
我要回答