C#类型理解
C#类型主要分为两类:值类型和引用类型。C#主要类型如下:
类别 |
描述 |
|
值类型 |
简单类型 |
有符号整形:sbyte,short,int,long |
无符号整形:byte,ushort,uint,ulong |
||
Unicode字符:char |
||
IEEE浮点型:float,double |
||
高精度小数:decimal |
||
布尔型:bool |
||
枚举类型 |
用户自定义类型:enum |
|
结构类型 |
用户自定义类型:struct |
|
引用类型 |
类类型 |
所有其他类型基类:object |
Unicode字符串:string |
||
用户自定义类型:class |
||
接口类型 |
用户自定义类型:interface |
|
数组类型 |
单维多维数组:int[],int[,] |
|
委托类型 |
用户自定义类型:delegate |
C#值类型和引用类型的区别:
1、定义:值类型(Value Type)实例通常分配在线程的堆栈(stack)上,不包含任何指向实例数据的指针,变量本身就包含了实例数据。值类型的实例要么在堆栈上,要么内联在结构上。值类型包括:简单类型,结构体类型和枚举类型。
引用类型(Reference Type)实例分配在托管堆(managed heap)上,变量保存了实例数据的内存引用。引用类型存储对值的内存地址的引用,位于堆上。引用类型包括:类类型,数组,委托类型和接口类型。
2、内存概况:值类型分配在堆栈上,每实例一个值类型则在堆栈上分配一个内存地址,不同的变量占用了不同的堆栈地址,改变一个变量不会影响其他变量。
引用类型在堆栈中只是保存了其实例数据的引用地址,实际的数据保存在托管堆中,所以可能不同的变量保存了同一地址的数据引用,改变一个变量会影响另一个变量的值。
3、嵌套结构:引用类型嵌套值类型时,作为引用类型实例的一部分也会被分配到托管堆上。
值类型嵌套引用类型时,引用类型作为值类型的成员变量,堆栈上保存该成员的引用,而成员的实际数据还是保存在托管堆上。即值类型实例总是分配在它声明的地方,声明为局部变量时内存被分配在堆栈上,声明为引用类型成员变量时内存被分配到托管堆上;引用类型总是分配在托管堆上。
4、值类型继承自ValueType,引用类型继承于object。
5、值类型的内存不由GC控制,作用域结束时,值类型会自动释放,减少托管堆的压力,具有性能优势。而引用类型的内存分配与回收都由GC来完成。
6、值类型时密封的,不能作为基类,但可以单继承或者多继承接口。引用类型一般可以继承。
7、值类型不具有多态,引用类型具有多态。
8、值类型不能为null,会自动初始化为0;引用类型默认初始化为null,表示没有指向任何托管堆的引用地址。
9、值类型由2种状态:装箱和未装箱;引用类型只有一种形式:装箱。