Boxing/unboxing,更改装箱值的引用副本不会反映到装箱值
Boxing/unboxing, changing the copy of the refence of the boxed value does not refected to the boxed value
所以我通读了 the documentation of Microsoft here。
考虑以下代码:
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.
相同
为什么 p 的变化没有反映到 o?他们不是指向同一个地址吗?
您的理解有误;这条线
object p = o;
分配 p
相同的引用;然而:
o = 1;
创建一个 new 对象(盒装整数)并将 new 引用分配给 o
; o
和 p
现在是不同的引用;
p = 2;
然后对 另一个 盒装对象和引用做同样的事情
您的期望 是 "ref locals" 的工作方式,但是:
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
所以我通读了 the documentation of Microsoft here。
考虑以下代码:
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.
为什么 p 的变化没有反映到 o?他们不是指向同一个地址吗?
您的理解有误;这条线
object p = o;
分配 p
相同的引用;然而:
o = 1;
创建一个 new 对象(盒装整数)并将 new 引用分配给 o
; o
和 p
现在是不同的引用;
p = 2;
然后对 另一个 盒装对象和引用做同样的事情
您的期望 是 "ref locals" 的工作方式,但是:
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