tags:

views:

130

answers:

2

This is taken from Jon Skeet's excellent personal C# site (http://www.yoda.arachsys.com/csharp/):

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

1) Changing the value of first will not change the value of second -

2) although while their values are still references to the same object, any changes made to the object through the first variable will be visible through the second variable.

This is taken from the same sentence. What is meant by changing the value? I assume the value of a variable (eg int x = 4, or 5, or 45, etc).

Does this mean if first points to another compatible object, it won't have an effect on two?

Everything on that page makes sense, I think it's just an issue with my interpretation of the English.

Thanks

A: 

The difference between the value of the object itself and the contents of the object are not clear.

For example, it is possible to change the contents of second by calling methods on first, as in the call to Append in the example. However, setting the value of first to null does not set second to null.

You can see this easily by writing this code and stepping through it in a debugger.

dominic hamon
I see. "Value" would mean like its state - e.g. null, which, if first is set to, doesn't effect second. The contents of first, however, do effect second.
dotnetdev
I'd consider it unwise to refer to "state" in this fashion; an object's state is contained within an object itself, and changes to such are thus visible through all references. You run the risk of confusing yourself or others later.
Rob
+4  A: 

first is a reference to an object of type StringBuilder. That is, first stores a value that can be used to refer to an object on the heap that is type of Stringuilder. second is another reference to an object of type StringBuilder and its value is initially set refer to the same object that first is referring to.

If you change the value of first what you are doing is changing what the referent is. That is, you are using first to refer to a different object. This does not impact second; its value is unaffected by changes to the value of first. (Remember: the value of first and second are references that initially have the same referent. But just like with

int x = 1;
int y = x;
x = 2;

does not change the value of y, changing the value of first does not change the value of second.

On the other hand, when first and second refer to the same object, any changes to that object will be visible through both first and second.

Think of it like this. Let's say I create a text file first.html whose contents are

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

and I issue the command copy first.html second.html. Then both pages can be used to refer to the same webpage; by following the link we arrive at the same referent. If changes are made to the Stack Overflow home page, then accessing the homepage through either first.html or second.html will allow me to see those changes. But if I then change the contents of first.html to be

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

then I can no longer use first.html to refer to the Stack Overflow homepage. Moreover, this change does not impact the value of second.html. It is still

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

Think of the contents of these files as the values of a reference type, and the ultimate desination as the referent object.

Jason