C# 基础 – 装箱 / 拆箱, 堆 / 栈
前言
有些概念可能你用不到, 但是懂也无妨.
装箱 / 拆箱
参考: C#装箱和拆箱(Boxing 和 UnBoxing)
通常讲到这些都跟性能有关.
把值类型变成引用类型就叫装箱.
int number = 11; object obj = number;
int 是值类型, 放入到 object 引用类型中.
拆箱就是反过来
int number = (int)obj;
被装箱过才能被拆箱.
上面这类代码通常会出现在你想写动态类型, 反射这类代码的时候. 肯定会扣性能的分数但是, 如果在意性能的话,可以退而求其次试试看使用泛型或者方法重载去表达动态的部分.
栈 / 堆
参考: C# 堆和栈的简述
stack 和 heap 讲的是内存使用. 代码运行的时候会把变量 (值类型) 都放进 stack 中. 它像弹匣, 变量像子弹那样被塞进去, 然后从入口被发出. 所以它是 first in last out, 或 last in first out 概念.
stack 的变量只会保留短暂的时期, 比如一个函数中的变量在函数运行完以后就被释放了 (闭包不算丫).
heap 就不同, 它是内存指针, 一个变量 (引用类型) 只保留了值得内存地址. heap 需要靠垃圾回收才能释放. 垃圾回收会在某个时候检查所有的内存地址, 那些没有被任何变量引用的就会被释放掉. obj.value = null; <-- 把变量设置成 null 就是断开引用的手法.