核心区别:

特性 值类型 引用类型
存储位置 栈(或嵌入堆中的对象)
赋值方式 复制数据本身(深拷贝) 复制引用(浅拷贝)
默认值 0或false null
内存管理 自动释放(当超出作用域时) 由垃圾回收器管理(GC)
性能 通常更快(无GC开销) 可能较慢(GC)
类型实例 int,struct,enum,bool Class,string,array,delegate

值类型:

特点:

  • 直接存储数据值。
  • 赋值或传参时复制整个数据。
  • 生命周期与作用域绑定(例如方法结束时自动释放)。
  • 不支持继承(但可实现接口)。

示例:

int a = 10;
int b = a;  // b是a的独立副本
b = 20;     // a仍为10

public struct Point {
    public int X;
    public int Y;
}
Point p1 = new Point { X = 1, Y = 2 };
Point p2 = p1;  // 复制整个结构体
p2.X = 3;       // p1.X仍为1

引用类型:

特点:

  • 存储数据的内存地址引用(数据在堆中)。
  • 赋值或传参时复制引用(多个变量可指向同一对象)。
  • 由垃圾回收器(GC)管理内存。
  • 支持继承和多态。
class Person {
    public string Name;
}
Person p1 = new Person { Name = "Alice" };
Person p2 = p1;   // p2和p1指向同一对象
p2.Name = "Bob";  // p1.Name也变为"Bob"

int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;  // 复制引用
arr2[0] = 99;       // arr1[0]也变为99

字符串是引用类型,但行为类似与值类型(不可变性),对字符串进行修改会创建新的对象。

值类型:适合独立、短暂的小数据,强调性能和确定性释放。 引用类型:适合复杂对象、共享数据或需要继承的场景。