Boxing vs Unboxing

前端 未结 6 1904
暖寄归人
暖寄归人 2021-02-01 16:48

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

相关标签:
6条回答
  • 2021-02-01 16:50

    Here's another interesting variation that supports Stefan's comments:

            int i = 2;
            object a = i; // Boxing
            object b = a; // Referencing same address on heap as 'a', b == a
    
            b = i; // New boxing on heap with reference new address, b != a
    
    0 讨论(0)
  • 2021-02-01 17:00

    I think the answer to your question with unboxing is that: The result of an unboxing conversion is a temporary variable (more details: link).

    I think you were trying to do sth like:

    object a = new Point(10,10);
    object b = new Point(20,20);
    a = b;
    
    ((Point) b).X = 30; //after this operation also a.X should be 30
    

    The above code won't compile - details in the link above, and I think this is the answer to your question:

    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 heap?

    0 讨论(0)
  • 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 heap?

    No, not exactly. It leaves the object as it is on the heap (as the b variable is also referencing it) and creates a new object for the new value, which the a variable will reference.

    You are right that your second example does not use boxing. You can't access a value that is boxed in any other way than unboxing it, so there is no way to change a boxed value.

    Not even a mutable struct like Point can be changed when boxed. To access the properties of the struct you have to unbox it, so you can't change the boxed struct in place.

    0 讨论(0)
  • 2021-02-01 17:07

    b is still 1 because b is a reference that still points to the object on the heap with a value of 1. a is 2 because you assigned it to a new object on the heap with a value of 2.

    t2.x is 3 because t and t2 are two different references to the same object on the heap.

    0 讨论(0)
  • 2021-02-01 17:08
    1. You're right the second assignment replaces the first. It doesn't change the boxed value.

    2. Your example doesn't make use of boxing. The value (int) is stored as an int and not boxed.

    3. No, boxing still keeps the immutability guarantee.

    0 讨论(0)
  • 2021-02-01 17:16

    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?

    0 讨论(0)
提交回复
热议问题