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

时间:2011-11-09 17:59:41

标签: c# .net reference-type

为什么会产生“0”?

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

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

5 个答案:

答案 0 :(得分:28)

一张图片胜过千言万语:

enter image description here

答案 1 :(得分:20)

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

该论文不是cookie。地址不是cookie。该文件包含对包含cookie的地址的引用。

您获得第二张纸,标有“B”。在那张纸上,你制作了“A”内容的副本。现在你有两张纸,都说“123芝麻街”。两者都告诉你饼干在哪里。

你拿一张纸“A”并将其删除。 “A”不再指代cookie的位置。 B仍然存在。

您假设说“b = a”表示在B上写“饼干的位置,请参阅纸张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中。

答案 2 :(得分:6)

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

答案 3 :(得分:3)

拳击(这是在这里发生的过程)在following article中很好地解释了内存中发生的事例。

答案 4 :(得分:1)

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

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