一、基元类型
编译器直接支持的数据类型叫做基元类型。基元类型映射到FCL中存在的类型。
C#基元类型 | FCL类型 | 说明 |
---|---|---|
sbyte | System.SByte | 有符号8位值 |
byte | System.Byte | 无符号8位值 |
short | System.Int16 | 有符号16位值 |
ushort | System.UInt16 | 无符号16位值 |
int | System.Int32 | 有符号32位值 |
uint | System.UInt32 | 无符号32位值 |
long | System.Int64 | 有符号64位值 |
ulong | System.Uint64 | 无符号64位值 |
char | System.Char | 16位Unicode字符(C++中是8位) |
float | System.Single | IEEE32位浮点值 |
double | System.Double | IEEE64位浮点值 |
bool | System.Boolean | true / false值 |
decimal | System.Decimal | 128位高精度浮点值(常用于金融计算) |
string | System.String | 字符数组 |
object | System.Object | 所有类型的基类型 |
dynamic | System.Object | 对于CLR等同于object。但C#编译器允许使用简单的语法让dynamic变量参与动态调度 |
二、引用类型和值类型
1.哪些是值类型,哪些是引用类型?
1.1 值类型
(1)值类型包括结构(struct)和枚举(enum)。
(2)值类型的实例一般在线程栈上分配(也可作为字段嵌入引用类型的对象中)。
(3)所有值类型都是隐式密封的(无法继承)。
(4)所有结构都从 System.ValueType(派生自 System.Object 的抽象类) 派生。
(5)所以枚举都从 System.Enum(派生自 System.ValueType的抽象类) 派生。
1.2 引用类型
(1)引用类型包括类、委托、数组和接口。
(2)引用类型在托管堆上分配内存。
2.值类型和引用类型的区别
(1)值类型实例在栈上分配内存,引用类型实例在托管堆上分配内存。
(2)值类型变量赋值时进行逐字段的复制,引用类型变量赋值时只复制内存地址。
3.什么时候使用值类型(struct)?
(1)类型具有基元类型的行为。没有成员会修改类型的任何实例字段,即类型时不可变的。
(2)类型不需要从其他任何类型继承。
(3)类型不派生出其他任何类型。
(4)类型的实例较小(<=16字节)
(5)类型的实例较大但不作为方法实参传递,也不从方法返回(使用时不需要复制)。
4.值类型的装箱和拆箱
4.1 装箱:将值类型转化为引用类型
(1)在托管堆中分配内存。分配的内存量是值类型各字段所需内存量加上类型对象指针和同步块索引所需内存量。
(2)值类型的字段复制到新分配的堆内存。
(3)返回对象地址。
4.2 拆箱:将引用类型转化为值类型(与装箱不是互逆的,拆箱是获取指针的过程,紧接着会发生一次复制)
(1)获取已装箱对象中各个字段的地址。
(2)将字段包含的值从堆内存复制到栈上。