值类型相对来说较”轻“一些,例如int,char,bool之类的,而引用类型较”重“一些。例如,class,interface,delegate,string,object之类的。值类型分布在栈上(站直)。而引用类型分布在堆上,栈是一块连续的内存区域,由编译器自动分配和释放,具有先进后出原则。而堆则是有程序员自定分配,释放。装箱就是将值类型转换成引用类型,拆箱则是由引用类型转换成值类型。装箱的时候,先在堆上开辟一块空间,然后将栈上的数据复制到堆上,最后返回堆上的地址。拆箱:在栈上开辟一块地址,将堆上的值复制到栈上。装箱和拆箱是非常消耗性能的,编程中应该避免装箱和拆箱。值传递是将形参先复制出来后给实参,所以形参的改变,不会影响到实参。引用传递是将地址进行传递,方法操作是同一个变量。

 

C#中什么是值类型与引用类型?

值类型(继承valuetype类):struct、enum、int、float、char、bool、decimal。值类型总是分配在它声明的地方,作为局部变量时,存储在栈上;作为类对象的字段时,则跟随此对象存储在堆中。

引用类型:class、delegate、interface、array、object、string。引用类型存储在堆中。类型实例化的时候,会在堆中开辟一部分空间存储类的实例。类对象的引用(地址)还是存储在栈中。

C#中堆和栈的区别?

栈   值类型
我们经常说的数据结构堆栈,其实指的就是栈,它是一种先进后出【FILO】的数据结构,从管理角度来讲,它是由操作系统分配管理的,也就是说它是规整的,内存的大小在申请之后不会发生变化。因此,它不会出现碎片化,是一片连续的内存域,存放在栈中时要管存储顺序,并且读取速度非常的快。
什么样的数据存放到栈里面呢?我们经常声明的局部变量,一些基本数据类型,比如int,double,short,char等,这些数据在声明的时候,内存的大小已经确定,它们会被存放到栈中。使用栈的好处是,我们不需要管理内存的释放,这些内存会由操作系统自动释放,比如我们运行的一些函数,当我们函数结束的时候,它内部的变量申请的内存空间就会被自动释放,非常方便。
堆  引用类型
相比于栈的固定大小,堆的分配非常自由,是无序的,他是一片不连续的内存域,它是由程序员自己去分配的,用new、malloc等分配内存函数分配得到的就是在堆上。比如程序员考虑到某些情况需要更多的内存,它就可以在堆上面申请一个足够大的内存。除此之外,内存的分配非常自由,它并不要求是连续的内存,只要有空间,都可以被拿来分配。不过这样就会导致产生很多碎片,不利于高速读取,因此堆的操作的速度要比栈慢很多。
堆主要存放的是大小不固定的内存结构,因此,我们的数组和结构体经常被存放到堆上。对于全局变量我们也会放到堆上,因为它需要可以被任何地方访问,并且不能像栈一样被操作系统回收。如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。

C#中什么是装箱和拆箱?

装箱:把值类型转换成引用类型

拆箱:把引用类型转换成值类型

装箱和拆箱都是在堆或者栈上空间的操作,这些操作对性能的代价是很大的,尤其是对于堆上的操作,速度要比栈上慢的多,并且可能引发垃圾回收,影响系统的性能

1、减少操作2、使用泛型进行处理

https://www.cnblogs.com/huashanlin/archive/2007/05/16/749359.html

https://www.bilibili.com/read/cv20706053/

https://blog.csdn.net/Prototype___/article/details/122896972

https://www.cnblogs.com/duyao/p/16458973.html

https://blog.csdn.net/gangzhucoll/article/details/105332392 

https://www.cnblogs.com/oralig/p/7705482.html   1、尽可能使用泛型来进代替2、减少装箱和拆箱

C#中值传递与引用传递的区别是什么?
值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值复制给形参,此后,被调用方法中形参值的任何改变都不会影响到相应的实参。

引用传递时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参,因此,形参所引用的该地址上的变量与传递的实参相同,方法体内相应形参值得任何改变都将影响到作为引用传递的实参。

简而言之,按值传递传递的是值的副本,会在栈上多创建一个相同的变量。而引用传递传递的是地址,方法内操作的是同一个变量。