值类型和引用类型

来源:互联网 发布:scrollreveal.js 教程 编辑:程序博客网 时间:2024/05/16 08:53

      这篇博客应该在上学期就应该完成的,但是当初在学习C#的时候,无论如何也不能很好的理解值类型和引用类型,经过了C#版的机房,对于这门语言,渐渐的熟悉了起来,所以就拖到了现在才写,不过我觉得现在总结也不完,学习是个过程嘛,不管是回头对以前的博客做新的补充还是旧知识点的重新探究,都是学习中必不可少的一步。


值类型和引用类型



两种类型的区别


1. 内存上分布的区别

值类型:实例通常分配在线程的堆栈上

引用类型:实例通常分配在托管堆上


要理解上述的概念,首先要明白堆栈和托管堆是什么?其实把他们理解成内存中存储数据的两种结构即可。

下边我们举个小例子来说明他们存放的位置到底有什么不同:


 public static void Main(string[] args)       {           //定义一个值类型           int valuetype = 3;           //定义一个引用类型           string reftype = "celine";       }


    在上述例子中,我定义了两个变量,分别是值类型和引用类型,变量在堆栈中占用了不同的位置,因为我们知道,不管什么类型的变量,都只是一个实例数据的引用,他们都可以理解为一个地址,我们需要一个数据的时候就通过这个地址找到数据。而值类型和引用类型的区别在于实际数据的存储位置,图中一目了然,值类型的变量和实际数据都存储在堆栈中,而引用类型的实际数据存在了托管堆中。 

    这两种不同类型的分配导致了不同的管理机制,值类型的管理由操作系统负责,而引用类型的管理则由垃圾回收器(GC)负责。在这里多说一句,我们在用EA生成机房的框架的时候,会多出很多析构函数,析构函数的左右就是由垃圾回收器(GC)自动调用来进行资源的释放。


2.其他区别:

  • 值类型继承自ValueType,ValueType又继承自System.Object;而引用类型则直接继承与System.Object
  • 值类型的内存不够GC(垃圾回收器)控制,作用域结束时,值类型会被操作系统自行释放,从而减少了托管堆的压力;而引用类型的内存的内存管理则由CG完成。所以值类型在性能方面更高效
  • 值类型不能为NULL值,他会被默认初始化为0;而引用类型在默认情况下会初始化为null值,表示不指向托管堆中的任意地址。对值为null的引用类型的任何操作,都会引发NullReferenceExcption异常,想必大家在做机房的时候都会遇到这个问题,当调用了一个函数,但是这个函数却没有返还值的时候,就会有这个问题


总结


这篇先总结一下二者的区别,下一篇将介绍这两种类型的转换,也就是拆装箱操作








0 0