一、值类型和引用类型
C#
中的数据类型主要分为值类型和引用类型这两种,其中指针类型只是在unsafe
的上下文中才会出现。
1、值类型变量
- 值类型的变量总体有
6
6
6种,分别为:整型、浮点型、字符型(
char
)、布尔型(bool
)、枚举型(enum
)、结构体型(struct
)等。 - 其中枚举型(
enum
)和结构体型(struct
)为两种自定义的值类型。 - 其中整型可以细分为
8
8
8种,按表示数值的范围由小到大依次为:
byte
,sbyte
,short
,ushort
,int
,uint
,long
,ulong
。 - 其中浮点型可以细分为
3
3
3种,按表示数值的范围由小到大依次为:
float
,double
,decimal
。 - 值类型变量声明后,不管是否已经赋值,编译器都会为其分配内存,其存储在栈中。
2、引用类型变量
- 引用类型变量共有
5
5
5种,分别为:类(
class
)、字符串(string
)、数组、委托(delegate
)、接口类型。 - 在声明引用类型的变量时,该变量的初始值为
null
。 - 引用类型变量必需要使用
new
运算符显式创建对象的实例,其值存储在堆中。 - 当为该变量分配已经在其他位置使用
new
创建过对象时,该引用对象的值将发生改变。 - 引用类型变量由于可以被多个对象引用,且其只是对象值的一个引用,而不是值本身,因此可能会被别的对象修改其值。
二、两种类型总结
1、区别
- 值类型存储在内存的栈中,引用类型存储在内存的堆中
- 值类型存取速度快,引用类型存取速度慢
- 值类型表示实际的数据,引用类型表示指向内存堆中的指针或者引用
- 值类型继承自
System.ValueType
,引用类型继承自System.Object
- 栈的内存分配自动释放;而堆在
C#
中需要GC
释放 - 引用类型需要两段内存:第一段存储实际数据,它位于堆中;第二段是一个引用,指向数据在堆中存放位置。
2、注意
C#
中bool
类型不能转换成int