一、值类型

1.定义

值类型直接存储数据本身,通常分配在上(但作为类的成员时可能分配在堆上)。赋值时会创建数据的副本。

2.常用值类型

类型 关键字 精度 大小
无符号8位整数类型 byte 0 ~ 255 1 byte
有符号16位整数类型 short -32,768 ~ 32,767 2 byte
有符号32位整数类型 int -2,147,483,648 ~ 2,147,483,647 4 byte
有符号64位整数类型 long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8 byte
无符号16位整数类型 ushort 0 ~ 65,535 2 byte
无符号32位整数类型 uint 0 ~ 4,294,967,295 4 byte
无符号64位整数类型 ulong 0 ~ 18,446,744,073,709,551,615 8 byte
单精度浮点型 float 约 6~9 位有效数字 4 byte
双精度浮点型 double 约 15~17 位有效数字 8 byte
高精度小数型 decimal 28~29 位有效数字 16 byte
布尔逻辑型 bool true/false 1 byte
Unicode字符 char 单个 UTF-16 代码单元 2 byte

其他:

  • enum关键字,本质是整数类型(默认int)的命名常量集合。
  • struct关键字,可包含字段、方法、属性等,但不能继承(可实现接口)。

3.特征

  • 不能为null(除非使用可空值类型T)

  • 每个值类型变量独立保存自己的数据,一个变量的修改不会影响另一个

二、引用类型

1.定义

引用类型存储对数据的引用(内存地址),实际数据分配在托管堆上。赋值时复制引用,多个变量可指向同一对象。

2.常用引用类型

  • 类(class)
  • 接口(interface)
  • 委托(delegate)
  • 数组(array)
  • 字符串(string)
  • 动态类型(dynamic):编译时忽略类型检查,运行时解析操作。

3.特征:

  • 可以为null

  • 一个变量对对象内部状态的修改会影响到所有指向同一对象的其他变量

三、指针类型

1.定义

指针类型用于存储内存地址,类似于 C/C++ 的指针。仅在unsafe上下文中可用,且需要开启项目的不安全代码编译选项。

2.限制:

  • 不能指向引用类型或包含引用类型的结构体

  • 不能对GC托管对象进行指针操作(可能导致 GC 移动对象)

四、装箱与拆箱

装箱:将值类型隐式转换为object或任一接口类型。在堆上分配内存 → 复制值类型数据 → 返回引用地址。

拆箱:将object或接口类型显式转换回原始值类型。检查对象是否为目标值类型的装箱实例 → 复制回栈上的值类型变量。

示例

int i = 123;
object obj = i;          // 装箱
int j = (int)obj;        // 拆箱

// 错误的拆箱
long l = (long)obj;      // 抛出异常,因为 obj 装箱的是 int

更多推荐