Yes, of course, when unpacking the original is always not affected.
Down at the IL level there are two opcodes for unboxing: unbox.any and unbox .
According to MSDN regarding unbox.any :
When applied to the boxed type of a value type, the unbox.any command retrieves the value contained in obj (of type O), and therefore the equivalent of unbox, followed by ldobj.
and relatively unbox :
[...] unbox is not required to copy the value type from an object. Usually it just calculates the address of the type of value that is already present inside the box object.
Thus, a copy of the original value may or may not be made, but the original value always remains unchanged.
source share