一、C#数据类型
基础数据类型
值类型: int long uint ulong double decimal float bool byte char string enum struct
引用类型: object 数组 委托、事件
类
基本类型信息
二、值类型和引用类型
1)、栈与堆
栈是一种先进后出的数据结构,.netframework中其存储的数据空间不大,不可动态分配,但是其执行效率是非常高效的。.net framework中的方法调用都是在其上执行的。栈的空间是其自行管理的,出栈则是清空相应的空间,进栈则分配对应的空间。
堆是可以动态分配存储空间,可以存储大量数据的内存空间。其执行的效率比栈要低,并且不会自动维护内存空间,.net framework中堆的内存空间管理依赖于GC机制(gc机制略)。
2)值类型和引用类型
值类型和引用类型本质的区别在于数据存储的位置:值类型数据存储于栈,而引用类型存储于堆。
因为栈的空间相对较小,不适合存储引用类型的数据(引用类型数据占用空间较大),对应的栈中只存储引用类型在堆中的地址。
三、显示转换和隐式转换
隐式转换:即数据的类型的转换由编译器自动进行的,不需要代码指定转换。
例如int类型转换成long类型,因为long类型的数据范围包含了int类型的数据范围,转换时编译器自动转换。
显示转换:与隐式转换相反的数据类型的转换,即需要代码指定转换成对应的数据类型
1. 被转换类型的值要在目标类型的值范围之类,如果超出目标类型的最大或最小值,执行时会抛出异常。
2. 被转换类型的值同样必须与目标类型互相兼容。
例如
long l=1000;
int x=(int)l;
四、装箱与拆箱
1)装箱
什么是装箱:所谓装箱就是将值类型转化为引用类型的过程。
过程:
1、在托管堆中分配好内存,分配的内存量是值类型的各个字段需要的内存量加上托管堆上所以对象的两个额外成员(类型对象指针,同步块索引)需要的内存量
2、值类型的字段复制到新分配的堆内存中
3、返回对象的地址,这个地址就是这个对象的引用
2)拆箱
什么是拆箱:将引用类型实例转化成值类型的过程(如果引用类型无法转换成对应的值类型则会抛出异常)。
拆箱的代价比装箱要低的多,拆箱其实就是获取一个指针的过程。一个已装箱的实例在拆箱时,编译器内部实现:
1、如果包含了“对已装箱类型的实例引用”的变量为null时,会抛出一个NullReferenceException异常。
2、如果引用指向的对象不是所期待的值类型的一个已装箱实例,会抛出一个InvalidCastException异常。
3、没有异常时,返回转换后的值。
因为装箱和拆箱涉及到内存的重新分配,以及数据的复制等操作,会影响程序的执行效率,所以在编码的过程中,我们要尽量避免不必要的额装箱拆箱操作。