C#的数据类型分为三类,值类型,引用类型和指针类型。指针类型只能用于不安全模式,而值类型和引用类型通过拆箱和装箱机制可以相互转换,通过中间的object类型,所以C#的所有种类直接或间接地从object类种类派生而来。
值类型
值类型数据存储在栈中,栈用于存放固定长度的数据,分为简单类型,结构类型和枚举类型。
结构类型:把不同类型的数据组合在一起,便于使用。跟类相似,包含数据成员和函数成员的数据结构,类类型是一种引用类型。结构类型用关键字Struct定义,可以嵌套定义。
枚举类型:成员只能是整数类型,枚举类型主要用于表示一组逻辑上相关项的组合,使用关键字Enum来定义。
结构类型的变量值包含了所有成员的值,枚举类型只能列举出个各成员。默认第一个元素对应的整数值为0.
枚举类型比无格式的整数的优势:
使代码易于维护。
代码清晰,允许用描述的名称表示整数值
代码易于键入。
引用类型
引用类型数据存储在堆中,堆是由new分配的内存,一般由程序员分配释放。一般速度比较慢,容易产生内存碎片大多数复杂的C#数据类型,包括我们自己声明的类都是引用类,它们分配在堆中。
该类型的变量不直接存储所包含的值,指向它要存储的值,存储实际数据的引用值的地址。
引用类型有数组,类,委托和接口4中。
装箱和拆箱
值类型和应用类型之间是可以转换的,这种转换的实现,依赖于一种机制:装箱(Boxing)和装箱(unboxing).拆箱和装箱对任何类型的值来说最终都可以看作object类型。
装箱:将一个值类型隐式的转换为Object类型,把值类型的值装箱,也就是创建一个object实例并将值赋给object
Int a=10;
Object obj =a;
拆箱:把Object类型显示的转换成一个值类型。先检验对象实例,将值从实例中复制出来,赋给值类型变量。
Int k=10;
Object obj=k;
Int j =(int)obj;