C# 中的值类型和引用类型
目录
数据的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。 类型被分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。
下图展示了每种类型的单个数据项是如何存储的。对于值类型,数据存放在栈里。对于引用类型,实际数据存放在堆里而引用存放在栈里。 值类型所有值类型都隐式派生自
值类型直接包含值,换言之,变量引用的位置就是内存中实际存储值的位置。 因此,将一个值赋给变量 1,再将变量 1 赋给变量 2,会在变量 2 的位置创建值的拷贝,而不是引用变量 1 的位置。 这进一步造成更改变量 1 的值不会影响变量 2 的值。 下图对此进行了演示。 类似地,将值类型的实例传给 引用类型引用类型的变量存储对数据存储位置的引用,而不是直接存储数据。要去那个位置才能找到真正的数据。所以为了访问数据,“运行时”[1] 要先从变量中读取内存位置,再“跳转”到包含数据的内存位置。 为引用类型的变量分配实际数据的内存区域称为堆(heap)。 由于引用类型只拷贝对数据的引用,所以两个不同的变量可引用相同的数据。因此,对一个变量执行的操作会影响另一个变量所引用的对象。无论赋值还是方法调用都会如此。因此,如果在方法内部更改引用类型的数据,方法执行完成之后,将看到更改后的结果。 总结一个类型要么是值类型,要么是引用类型。区别在于数据存储的方式:对于值类型,数据存放在栈里。对于引用类型,实际数据存放在堆里而引用存放在栈里。 引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两个变量可引用同一对象;因此,对一个变量执行的操作会影响另一个变量所引用的对象。 对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |