Value types store the value and reference types store a
reference to the value. The value types are how most people think of variables.
Reference types work a little bit like pointers in other languages. Since C# is
a managed language these pointers are hidden away so the programmer does not
have access to them.
Assignment of reference types does not duplicate the value
as is done with value types. The reference types only copy the reference to the
value. This means that the information for a reference type is only stored in
that one spot and multiple variables can point to it.
Reference types can be null. Value types cannot be null, but
a struct exists which can wrap around value types so they can be null. The
Nullable struct can be used to allow the types which are normally value types
to be able to handle null values.
Boxing is the process of storing a value type as a reference
type. Unboxing is the process of retrieving the value type back from the
reference type.