This post is an aide-memoire as I learn more about boxing and unboxing in C# and is based upon this part of the C# docs.
Boxing
Is the process of converting a value type (such as int or bool) to the type Object or to any interface type implemented by this value type. When the CLR boxes a value type, it wraps the value inside a System.Object and stores it in the managed heap.
Boxing is implicit.
int i = 10; // this line boxes i object o = i;
Although it is possible to perform the boxing explicitly it is not required.
int i = 10; // explicit boxing object o = (object)i;
Unboxing
Extracts the value type from the object.
Unboxing is explicit.
int i = 10; // boxes i object o = i; // unboxes the object to the int value type named j int j = (int)o;
Performance
Both boxing and Unboxing are computationally expensive operations.