值类型和引用类型原理
值类型引用类型:值类型存储在声明的地方,引用类型存储在托管堆上。 如果详细来讲就和计算机运行的原理有关,计算机有硬盘和内存,硬盘运行速度慢,内存运行速度快,所以我们在启动程序的时候,把一些东西加载到内存中,比如在windows中,会起一个进程,来进行资源分配,进程在启动的时候会把内存分为几块,全局区,代码区,线程栈区,托管堆区,其中全局区和代码区都是全局,是所有都可以使用,托管堆区也是全局的,线程栈不是,每个进程启动以后只是管资源分配,具体执行任务都是线程来执行,线程来执行的时候会给每个线程开辟一个自己独有的空间,叫做线程栈,然后当我声明一个变量的时候,首先先在线程栈里面开辟一个空间,把他存进去,这是线程独有的,在线程栈里面,有些类型会特别大,比如声明一个类中会存一堆属性,如果把所有的都存到线程栈里面,肯定会存不下,并且用的时候会非常麻烦,比如检索的时候,所以我会把大的类型存到托管堆里,然后在线程栈存一个地址,进行索引,这就是值类型引用类型。举个例子:比如当一个值类声明的时候不在引用类型下面的时候,我就会在线程栈中开辟一个空间用来存这个值,如果是引用类型,我会在托管堆中开辟一块空间,然后在线程栈中把这个托管堆的头地址存下来,这个就是值类型和引用类型最大的区别,他们产生了以后,又存在了一个问题,拆箱和装箱的问题,拆箱:当引用类型要转化为值类型,因为我在引用类型中就存了一个值类型,比如存了一个int,那么我就需要把这一步拆开,先在线程栈中开辟一个空间,把这个值存进去,然后一个值转换为引用类型,在托管堆中开辟一个空间,把值放进去,然后开辟一个空间来指向它,这就是引用类型,拆箱和装箱会引发很大的性能问题,为了解决这个问题,在C#2.0就推出了一个泛型,泛型允许类型当作参数来传递,然后当客户端用的时候传类型进去,是什么类型,就是什么类型,就不会产生拆箱和装箱的操作,也就不会引发性能问题。