c# - 装箱/拆箱,更改装箱值的引用副本不会反映到装箱值
问题描述
所以我在这里通读了微软的文档。
考虑以下代码:
int i = 0;
object o = i;
object p = o;
o = 1;
p = 2;
Console.WriteLine($"o:{o}, p:{p}");
//output o:1, p:2
我的理解是装箱发生在 上object o = i;
,现在o是对堆中值的引用。然后将p分配为与o相同。
为什么不将prefected更改为o?他们不是指向同一个地址吗?
解决方案
您的理解不正确;线
object p = o;
分配p
相同的参考;然而:
o = 1;
创建一个新对象(装箱整数)并将新引用分配给o
; o
现在p
是不同的参考;
p = 2;
然后对另一个装箱对象和参考做同样的事情
但是,您的期望是“参考本地人”的工作方式:
int i = 0;
ref int o = ref i;
ref int p = ref o;
o = 1;
Console.WriteLine(i); // 1
p = 2;
Console.WriteLine(i); // 2
推荐阅读
- javascript - 功能未按预期执行。我希望页面切换到“设置”,但这不会发生
- apache-kafka-streams - Spring Cloud Kafka 流 DefaultPollableMessageSource 不可用
- c - 跟踪 gdb 中函数执行的所有变量
- python - 为散点图中的每个点分配颜色
- json - 谷歌脚本 | 我收到 ReferenceError:使用“jared@jaredgibb.xyz”指示收件人电子邮件时未定义收件人
- c# - 我想在组合框中显示所有 sql 名称表
- java - Integer.valueOf() 混淆
- python - 在python中开发一个打印网格的函数
- python - 在线程的整个生命周期中使用 id(threading.current_thread()) 作为线程标识符可以吗?
- javascript - ParseInt 丢弃数字