装箱:值类型转换为引用类型。拆箱:引用类型转换为值类型。
在.net编程中,我们经常会遇到一些string转int,或者int转string的事情,做财务和绩效系统的时候为了便于对象映射或前后端便于传参将float(或double,int)转string的案例,在这些转换过程是否存在性能损耗?为什么装箱和拆箱会影响到程序的性能呢?
第一步:首先需要了解.net中哪些是值类型和哪些是引用类型:
值类型:int(整数),float(单精度浮点),double(双精度浮点),decimal(高精度浮点),char(字符),bool(布尔),struck(结构),enum(枚举)
引用类型:object(对象),string(字符串),class(类),interface(接口),Delegate(委托),Array(数组)
其中int,float,double,decimal,char,bool,object,string是预定义的类型;struck,enum,class,interface,Delegate,Array是复合类型。
第二步:了解值类型和引用类型在内存(栈和堆)中的存放位置
值类型一般存放在内存的栈上,引用类型一般存放在内存的堆上。例,int a=1;int b=2;int[] arr=new int[3],下面两张图可以说明Array的存储位置。虽然arr在栈上,但栈上没有 存放arr的内容,内容在堆上存放,栈上存放的是arr和一个堆的地址0x0011。
第三步:实例说明,方法穿参数循环一千万次,第1种:int类型=》int类型;第2种:int类型=》object类型;第3种:int类型=》T泛型
输出:
总结:当数据量达到一定量的时候,编写程序的时大量的使用装箱或者拆箱,会影响程序的性能。
解决方案:1.尽量少写装箱和拆箱代码;2.使用泛型代替原有参数传递或者类型转换。