上面是MSDN里关于C#语言里类型的分类。
1.值类型
1.1 定义
何为值类型?许多工具书说得很专业化,值类型分配在线程堆栈上,本身就是实例化的类型。说白了,它完完整整地生存活在程序所在的内存堆栈,没有额外占用其它的内存空间。
1.2 生命周期
前面说了,它存在线程的堆栈内,所在作用域结束,它就结束。
1.3 应用原理
把一个值类型赋给别一个值类型,实际是在线程堆栈上新创一个空间,把原来的数据作一个数据拷贝。 改变其中一个值不会影响另一个值。
-
值类型其实也就是“轻量级”类型。把像byte这样简单的数据直接分配在程序线程堆栈里,不需要动用GC进行内存回收,所以在性能优于引用类型,处理较小的数据时有明显的优势。
-
类型不需要表现出行为时,不需要类来实现。如果类型以存存储数据为目的时,值类型作优先选择;
-
值类型没有继承,多态,封装等面向对面象的功能,结构简单。因此在不必多态的情况下,优先考虑值类型;
-
值类型作为参数传递时,传递的时实例数据,不暴露数据的内存结构,安全性能较高。但过多的使用会折损性能;
-
值类型不能为null,初始化时自动设为0.
2. 引用类型
2.1 定义
引用类型的实例数据存储在托管堆上,变量存储是实际上是实例数据的内存引用。
2.2 生命周期
存储在托管堆里的实例数据会由GC进行回收。
2.3 应用原理
把一个引用类型赋给另一个引用类型,实际是把实例数据的引用地址赋给第二个引用类型,改变其实一个的值会跟着影响另一个的值。
-
引用类型有继承、多态、封装的面向对象功能,有较大的灵活性。如果类型需要表现行为,则采用引用类型;
-
在默认的情况下,引用类型创建为null,表示没有指向任何引用地址。对指向null的引用类型任何操作,会引发NullReferenceException.