Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are these boxing/unboxing examples

Are 2 and 3 boxing/unboxing examples?

1) The documentation example:

int i = 123;
object iBoxed = i;
i = (int) iBoxed;

2: Is the boxing/unboxing as well?

int i = 123;
object iBoxed = i;
i = Int32.Parse(iBoxed.ToString());

3: Is the boxing/unboxing as well?

int i = 123;
object iBoxed = i;
i = Convert.ToInt32(iBoxed);

I assume that in all examples technically happens the same.

  1. A value type is created on the stack
  2. A reference is created on the stack, the value is copied to the heap.
  3. The heap value is copied to the reference. The reference gets deleted.

So I guess 2 und 3 are examples for boxing/unboxing?

like image 624
Robert Avatar asked Jun 06 '11 08:06

Robert


2 Answers

In all three examples:

iBoxed is a boxed copy of i.

In example 2: There is no unboxing involved here, as ToString is a virtual method that will finally resolve to int.ToString, which will then be parsed by int.Parse, returning a non-boxed int on the stack.

In example 3: iBoxed will get unboxed in the body of the method Convert.ToInt32 and returned as a non-boxed integer, on the stack again.

like image 183
user703016 Avatar answered Sep 18 '22 13:09

user703016


The second example is boxing but not unboxing. The int.parse won't compile because it expects a string and iBoxed is an object. I think you are mixing the concepts of boxing and conversion. Boxing is really about taking a value type ie POD as they say in C and treating it as reference unboxing is the ability to extract that same value type out of its container.

Ex 2. Fixed

int i = 123;  // Assigment 
object iBoxed = i ; // This is boxing 
i = int.parse(iBoxed.toString());  //This is unboxing but only for the twostring method the assignment is a value type copy. 
like image 20
rerun Avatar answered Sep 22 '22 13:09

rerun