In programming language theory, a reference type is a data type that refers to an object in memory. A pointer type on the other hand refers to a memory address. Reference types can be thought of as pointers that are implicitly dereferenced. The objects being referred to are dynamically allocated on the heap whereas value types are allocated automatically on the stack. In languages supporting garbage collection the objects being referred to are destroyed automatically after they become unreachable.
When a reference type variable refers to an immutable object it behaves with the same semantics as a primitive value type. The fact that the object being referred to cannot be modified by any of the references to it means the only way to change the value of the reference variable is through assignment. The use of the Number classes in the Java programming language is an example of this behavior.
Language and platform support
struct keyword defines a value type, while the class keyword defines a reference type.value class and value struct define managed value types, while the ref class and ref struct pairs define managed reference types.ref (reference); it implements a simple mutable cell, although its widespread use is generally discouraged in favor of a more purely functional style.