Another recent C# interview question I had was if I knew what Boxing and Unboxing is. I explained that value types are on Stack and reference types on Heap. When a value is cast to a reference type, we call it boxing and vice versa.
Then he asked me to calculate this:
int i = 20;
object j = i;
j = 50;
What is i
?
I messed it up and said 50, where its actually 20. Now I think understand it why, however when I was playing with different combinations I was surprised to see this:
Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing
I was expecting to see b == 2
as well, but it isn't, why? Is it because the second boxing destroys and replaces the whole a
object on the heap?
Because if I do this, it's fine:
public class TT
{
public int x;
}
TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;
What is t2.x
? It should be 3, and it is. But this is not an example of boxing / unboxing at all, is this correct? So how would you summarize this?
Could the values ever become the same in a boxing/unboxing conversion as above?
Very short: boxing means creating a new instance of a reference type. If you know this, you understand that one instance does not change by creating another.
What you are doing with a = 2
is not changing the value in the 'box', you are creating a new instance of a reference type. So why should anything else change?