Start here. This is the direct spoken answer to practice first.
Why this question matters
Boxing is easy to dismiss as old syntax, but it can still create allocations and copied state in generic-looking logging, formatting, interface, and collection code.
Boxing copies a value type into an object on the managed heap so it can be treated as object or as an interface it implements. Unboxing checks that the boxed value has the exact expected value type and copies the value out. For example, assigning an int to object boxes it, and casting that object back to int unboxes it. Casting a boxed int directly to long fails even though an ordinary numeric conversion from int to long is valid.