10

为什么这会产生“0”?

object a = 0;
object b = a;
a = null;
Console.WriteLine(b.ToString()); // Produces "0"
Console.Read();

b 不是指向同一个位置并设置 a = null 有效地使 b 为空吗?

4

5 回答 5

33

一张图片胜过千言万语:

在此处输入图像描述

设置a = null删除a对对象(装箱整数)的引用(箭头0)。它不会影响对象本身。b之后仍然引用未更改的对象。

于 2011-11-09T18:27:11.090 回答
22

您想知道 cookie 在哪里。你有一张纸,标有“A”。纸上用铅笔写着“芝麻街 123 号”。

纸不是饼干。该地址不是 cookie。该文件包含对包含 cookie 的地址的引用。

您获得第二张纸,标有“B”。在这张纸上,您复制了“A”的内容。现在你有两张纸,都写着“芝麻街 123 号”。两者都告诉你 cookie 在哪里。

你拿一张纸“A”擦掉它。“A”不再指 cookie 的位置。B 还是一样。

您假设说“b = a”意味着在 B 上写下“关于 cookie 的位置,请查阅纸 A”。但这不是 C# 中“b = a”的意思;这意味着制作引用的副本,而不是制作引用的别名

在 C# 中,要为引用创建别名,您使用“ref”关键字,这很令人困惑:

void M(ref object b)
{
    b = null;
}
...
object a = 0;
M(ref a);
// "b" now becomes an alias for "a"; when "b" is nulled out, so is "a" because they are the same variable with two different names.

在 C# 中,您只能在调用像这样采用 ref 参数的方法时执行此操作。C# 不支持您想要的功能,但我们考虑过支持它:

object a = 0;
ref object b = ref a;
a = null; // b and a are aliases for the same variable now.

您是否迫切需要此功能?如果你这样做,请告诉我它是什么。这将帮助我们优先考虑该功能是否值得在假设的未来 C# 版本中使用。

更新:完成了!此功能已添加到 C# 7。

于 2011-11-09T18:50:41.460 回答
6

您正在将引用设置为 null,您没有将引用指向的对象更改为. a并且b是两个独立的引用,因此设置anull当然会b保持不变(想想“指针”),它只是意味着 a 现在指向null(“无处”)。

于 2011-11-09T18:01:16.027 回答
3

拳击(这里发生的过程)在下面的文章中有很好的解释,并举例说明了内存中发生的事情。

于 2011-11-09T18:02:04.650 回答
1

以下是正在发生的事情的描述:

object a = 0; // pointer a = 0xSomeA
object b = a; // pointer b = 0xSomeB
a = null; // nulling a, now 0x00; b still the same
于 2011-11-09T18:03:33.717 回答