基本概念
值类型(Value Type):
值类型实例通常分配在线程的堆栈(Stack)上,并且不包含任何执行实例数据的指针,因为变量本身就包含了其数据实例。其在MSDN的定义为:值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么在内联在结构中。
值类型主要包含:简单类型、结构体类型、枚举类型等。通常声明为一下类型:int、char、float、long、bool、struct、enum、short、byte、decimal、等等。
引用类型(Reference Type):
引用类型实例分配在托管堆(managed heap)上,变量保存了实例数据的内存引用。其在MSDN中的定义为:引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。而自描述类型可以进一步细分为数组和类类型。
内存中的分配
值类型实例总是分配在它声明的地方,声明为局部变量时其被分配在堆栈上,声明为引用类型成员时其被分配在托管堆上;引用类型实例总是分配在托管堆上。
通用规则
>.string类型是个特殊的引用类型,具有Immutability特性(相同的string在内存只有一个),因此每次对string的改变都会在托管堆中产生一个新的string变量。另外string类型重装了==操作符,比较的是实际的字符串,而不是引用地址,这一点和值类型一样。
>.引用类型在性能上不如值类型,主要是因为一下几方面:
a.引用类型变量要分配在托管堆上;内存释放则有GC完成,GC执行时会遍历所有的托管堆对象,按照一定的递归遍历算法找出所有的可达对象和不可访问的对象,对于不可访问的对象会释放回收内存,造成一定的GC堆压力。
b.必须同时完成对其附加成员的内存分配过程
值类型的内存不由GC控制,作用域结束时,值类型会自动释放。处理数据较小的情况时,应优先考虑使用值类型。
>.值类型都继承自System.ValueType,而System.ValueType又继承自System.Object,其主要区别是ValueType重写了Equals方法,实现对值类型按照实例值比较而不是引用地址比较。
>.基元类型,是指编译器直接支持的类型。例如:int对应于System.Int32。
类型的判等