C#: reference type and value type

1. Class is reference type while Struct is value type.

2. Referece type data will be allocated on the heap always, while value type data will be either on the stack as local variable for example or on the heap.

3. Referece type holds a reference to the object on the heap, just like holding its address; value type, holds the object directly.

4. Reference types support single-implementation and multiply-interface inheritance. They can derive from another reference type or have a reference type derive from them. However, value types can’t derive from other value types.

5. Finalization is a process that occurs when the CLR is performing garbage collection, cleaning up objects from memory. Value type objects don’t have a finalizer, but reference types
do. A finalizer is a special class member that could be called by the CLR garbage collector during cleanup. Value types are either garbage collected with their containing type or
when the method they are associated with ends. Therefore, value types don’t need a finalizer. Because garbage collection is a process that operates on heap objects, it is possible for
a reference type to have a finalizer.

6. Reference type is just a reference so pass, copy and use it: no worries; while value type, when it's copied, whole data will be copied, which should totally be avoided especially in passing it as parameters in function callings. 

REFERENCE TYPE OR VALUE TYPE: WHICH TO CHOOSE?
As a rule of thumb, I typically create new types as classes, reference types. The exception is when I have a type that should behave more like a value type. For example, a
ComplexNumber would probably be better as a struct value type, because of its memory allocation, assignment behavior, and other capabilities such as math operations that
are similar to built-in value types such as int and double.

原文地址:https://www.cnblogs.com/taoxu0903/p/1670976.html