将类型引用类型设置为null不会影响复制的类型?

为什么这会产生“0”?

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

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

一张图片胜过千言万语:

在此处输入图像描述

您想知道cookie的位置。 你有一张纸,标有“A”。 在纸上写着铅笔“123芝麻街”。

这篇论文不是一个cookie。 地址不是cookie。 本文包含对包含cookie的地址的引用。

你得到第二张纸,标有“B”。 在那张纸上,你复制了“A”的内容。 现在你有两张纸,都说“123 Sesame Street”。 两者都告诉你cookies在哪里。

你拿一张纸“A”并擦掉它。 “A”不再指代cookie的位置。 B仍然如此。

您假设说“b = a”表示在B上写“cookies的位置,请参阅纸张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#不支持您想要的function,但我们考虑过支持它:

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

您是否迫切需要此function? 如果你这样做,请让我知道它是什么。 这将有助于我们优先考虑该function是否值得在假设的未来版本的C#中进行。

更新:它完成了! 此function已添加到C#7中。

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

拳击(这是在这里发生的过程)在下面的文章中很好地解释了内存中发生的事情的例子。

这是对正在发生的事情的描述:

 object a = 0; // pointer a = 0xSomeA object b = a; // pointer b = 0xSomeB a = null; // nulling a, now 0x00; b still the same