C#值类型 vs 引用类型以及在工控上位机应用

一、核心本质区别(根本)

  • 值类型:存实际数据,变量直接持有数据,赋值传副本(改副本不影响原数据)
  • 引用类型:存内存地址(引用),变量指向堆上的实际数据,赋值传地址(改一个全影响)

二、栈 (Stack)/ 堆 (Heap) 分配规则(必背)

1. 栈分配(轻量、速度快、自动回收)

✅ 值类型:局部变量(方法内)、方法参数(非 ref/out)默认栈分配✅ 补充:结构体(struct)哪怕字段是引用类型,结构体本体仍在栈,字段指向堆

2. 堆分配(容量大、速度慢、GC 回收)

✅ 引用类型:所有对象(class / 数组 / 接口)必在堆,栈只存它的引用地址✅ 值类型堆分配 3 种特例(工业开发高频坑)

  1. 值类型作为引用类型的字段(如 class 里的 int 字段,随 class 对象入堆)
  2. 值类型被Boxing(装箱)(后文详说)
  3. 异步方法 / 迭代器中(await/yield),值类型会被编译器封装到堆上的状态机

三、Boxing(装箱)/Unboxing(拆箱) 完整解析

1. 定义(通俗讲)

  • 装箱:值类型 → 引用类型(堆分配 + 数据拷贝,性能损耗)
  • 拆箱:引用类型(装箱后的)→ 值类型(堆数据拷贝到栈,无新分配)⚠️ 拆箱必须拆到原类型,否则报错(如 int 装箱不能拆成 long)

2. 触发场景(工业开发高频触发点,必避)

  1. 值类型赋值给 object / 接口(如 int→object、int→IComparable)
  2. 值类型加入非泛型集合(如 ArrayList.Add (10),工业里老项目常见)
  3. 泛型方法未约束类型(如 void F<T&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工业程序猿老赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值