核心区别:
特性 | 值类型 | 引用类型 |
---|---|---|
存储位置 | 栈(或嵌入堆中的对象) | 堆 |
赋值方式 | 复制数据本身(深拷贝) | 复制引用(浅拷贝) |
默认值 | 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
字符串是引用类型,但行为类似与值类型(不可变性),对字符串进行修改会创建新的对象。
值类型:适合独立、短暂的小数据,强调性能和确定性释放。 引用类型:适合复杂对象、共享数据或需要继承的场景。