All types in C#, whether built-in or user-defined custom types, can be categorized as either value types or reference types.
- Value types
- Derive from System.ValueType (which derives from System.Object)
- Allocated on the stack (unless declared inside a reference type)
- Value type variable contains value directly
- Assignment makes a copy of the value
- Passed by value (a copy is made)
- Not garbage collected–die when they go out of scope
- Either struct or enum
- Sealed–can’t inherit from them
- Reference types
- Derive from System.Object or another reference type
- Allocated on the heap
- Reference type variable contains a reference (pointer) to the object’s contents (or contains null)
- Assignment creates a new reference to the original object
- Passed by reference (pointer to object is passed)
- Garbage collected
- One of: class, delegate, array or interface
- Support inheritance