C#中 变量类型分两种:值类型和引用类型
由此引发两种形式的内存空间:堆栈和托管堆
堆栈(又称栈):存放所有值类型的数据
托管堆:存放所有引用类型的数据
值类型的变量本身就存放数据
而引用类型则存储实际数据的引用
值类型有个特点,那就是大小都固定,比如一个字节的Byte、4个字节的int。即使数据变了,占的存储空间也不会变,这里的整形i直接对应着他的数据的存储空间,这个存储空间就是栈。
而stu直接对应到保存stu数据的地址或引用,其实这个地址本身是大小固定的,也保存在栈上,而stu对象的具体数据都保存在堆上,如果需要获取stu对象的数据,自然可以按照保存数据的地址找到数据,这好比根据别墅的地址找到别墅一样。
。Net程序首先被编译成IL程序,然后再托管执行。
值类型直接从堆栈(又称栈)里取值就可以
引用类型必须要先从堆栈里边取出他的地址,再根据这个地址到堆里边找到对应的值。
值类型
C#的所有值类型均隐式派生自System.ValueType:
分类 | 说明 | 范围 | |
整数类型 | sbyte | 8位 | -128~127 【-28-1 ~ (28-1+1)】 |
short | 16位 | 同上边计算方法一样 | |
int | 32位 |
| |
long | 64位 |
| |
byte | 8位(无符号,即无负数) | 0~255 | |
ushort | 16位(无符号,即无负数) | 0~65535 | |
uint | 32位(无符号,即无负数) |
| |
ulong | 64位(无符号,即无负数) |
| |
浮点类型 | float | 精确到7位数 | float num=9.24f; |
double | 精确到15~16位数 | 没特指类型就默认为double类型 | |
布尔类型 | true |
|
|
false | |||
枚举 | enum(派生于System.Enum); |
|
引用类型
分类 | 说明 | |
数组 | 派生于System.Array | |
用户自定义的类型 | 类 class | 派生于System.Object |
接口 interface | 接口不是一个“东西”,所以不存在派生于何处的问题 | |
委托 delegate | 派生于System.Delegate | |
Object | System.Object的别名 | |
字符串 | System.String的别名 |
可以看出:
- 引用类型与值类型相同的是,结构体也可以实现接口;
- 引用类型可以派生出新的类型,而值类型不能;
- 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);
- 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。