I kind of covered this one off when I covered value types. Boxing occurs when you put a value type on the heap and it is typically an expensive operation. Unboxing occurs when you take a value type that was previously boxed and put it back onto the stack.

Boxing and unboxing look suspiciously like casting in code but the underlying IL instructions that get generated are different – check it out for yourself with ILDasm!