值类型相对来说较”轻“一些,例如int,char,bool之类的,而引用类型较”重“一些。例如,class,interface,delegate,string,object之类的。值类型分布在栈上(站直)。而引用类型分布在堆上,栈是一块连续的内存区域,由编译器自动分配和释放,具有先进后出原则。而堆则是有程序员自定分配,释放。装箱就是将值类型转换成引用类型,拆箱则是由引用类型转换成值类型。装箱的时候,先在堆上开辟一块空间,然后将栈上的数据复制到堆上,最后返回堆上的地址。拆箱:在栈上开辟一块地址,将堆上的值复制到栈上。装箱和拆箱是非常消耗性能的,编程中应该避免装箱和拆箱。值传递是将形参先复制出来后给实参,所以形参的改变,不会影响到实参。引用传递是将地址进行传递,方法操作是同一个变量。
C#中什么是值类型与引用类型?
值类型(继承valuetype类):struct、enum、int、float、char、bool、decimal。值类型总是分配在它声明的地方,作为局部变量时,存储在栈上;作为类对象的字段时,则跟随此对象存储在堆中。
引用类型:class、delegate、interface、array、object、string。引用类型存储在堆中。类型实例化的时候,会在堆中开辟一部分空间存储类的实例。类对象的引用(地址)还是存储在栈中。
C#中堆和栈的区别?
https://pan.baidu.com/s/1BcVgPW-6pCrBtiVbh3eU8A?pwd=x4pv
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#中值传递与引用传递的区别是什么?
值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值复制给形参,此后,被调用方法中形参值的任何改变都不会影响到相应的实参。
引用传递时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参,因此,形参所引用的该地址上的变量与传递的实参相同,方法体内相应形参值得任何改变都将影响到作为引用传递的实参。
简而言之,按值传递传递的是值的副本,会在栈上多创建一个相同的变量。而引用传递传递的是地址,方法内操作的是同一个变量。