关于参考类型的问题

时间:2009-02-28 00:31:34

标签: c# reference

这取自Jon Skeet优秀的个人C#网站(http://www.yoda.arachsys.com/csharp/):

StringBuilder first = new StringBuilder();
StringBuilder second = first;
first.Append ("hello");
first = null;
Console.WriteLine (second);

1)更改first的值不会改变second的值 -

2)虽然它们的值仍是对同一个对象的引用,但是通过第一个变量对对象所做的任何更改都将通过第二个变量可见。

这取自同一句话。改变价值意味着什么?我假设一个变量的值(例如int x = 4,或5,或45等)。

这是否意味着如果首先指向另一个兼容对象,它将不会对两个产生影响?

该页面上的所有内容都有意义,我认为这只是我对英语解释的一个问题。

由于

2 个答案:

答案 0 :(得分:4)

first是对StringBuilder类型对象的引用。也就是说,first存储一个值,该值可用于引用堆类型为Stringuilder的对象。 second是对StringBuilder类型对象的另一个引用,其初始值设置引用first引用的同一对象。

如果更改first的值,您正在做的是改变指示对象的内容。也就是说,您使用first来引用不同的对象。这不会影响second;其值不受first值变化的影响。 (请记住:firstsecond的值是最初具有相同指示对象的引用。但就像

一样
int x = 1;
int y = x;
x = 2;

不会更改y的值,更改first的值不会更改second的值。

另一方面,当firstsecond引用同一个对象时,firstsecond都会显示对该对象的任何更改。

这样想。假设我创建了一个文本文件first.html,其内容为

<a href="http://stackoverflow.com">Stack Overflow</a>

我发出命令copy first.html second.html。然后两个页面都可以用来引用同一个网页;通过跟随链接我们到达同一指示物。如果对Stack Overflow主页进行了更改,则通过first.htmlsecond.html访问主页将允许我查看这些更改。但是,如果我然后将first.html的内容更改为

<a href="http://www.thedailywtf.com>The Daily WTF</a>

然后我再也不能使用first.html来引用Stack Overflow主页了。此外,此更改不会影响second.html的值。它仍然是

<a href="http://stackoverflow.com>Stack Overflow</a>

将这些文件的内容视为引用类型的值,并将最终目标视为引用对象。

答案 1 :(得分:0)

对象本身的值与对象内容之间的差异尚不清楚。

例如,可以通过首先调用方法来更改秒的内容,就像在示例中调用Append一样。但是,将first的值设置为null不会将second设置为null。

您可以通过编写此代码并在调试器中逐步执行此操作来轻松查看。