这取自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等)。
这是否意味着如果首先指向另一个兼容对象,它将不会对两个产生影响?
该页面上的所有内容都有意义,我认为这只是我对英语解释的一个问题。
由于
答案 0 :(得分:4)
first
是对StringBuilder
类型对象的引用。也就是说,first
存储一个值,该值可用于引用堆类型为Stringuilder
的对象。 second
是对StringBuilder
类型对象的另一个引用,其初始值设置引用first
引用的同一对象。
如果更改first
的值,您正在做的是改变指示对象的内容。也就是说,您使用first
来引用不同的对象。这不会影响second
;其值不受first
值变化的影响。 (请记住:first
和second
的值是最初具有相同指示对象的引用。但就像
int x = 1;
int y = x;
x = 2;
不会更改y
的值,更改first
的值不会更改second
的值。
另一方面,当first
和second
引用同一个对象时,first
和second
都会显示对该对象的任何更改。
这样想。假设我创建了一个文本文件first.html
,其内容为
<a href="http://stackoverflow.com">Stack Overflow</a>
我发出命令copy first.html second.html
。然后两个页面都可以用来引用同一个网页;通过跟随链接我们到达同一指示物。如果对Stack Overflow主页进行了更改,则通过first.html
或second.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。
您可以通过编写此代码并在调试器中逐步执行此操作来轻松查看。