It is important to understand the. NET type.
The main types of. NET are value type and reference type.
Differentiate these two types
1. Memory
Value Type:
Including enum enumeration and structure struct
Memory Allocation:
The instance is usually allocated to the thread stack and does not include any pointer to the instance data. Because the variable itself contains the instance data, the memory cannot be controlled by GC. When the scope ends, the value type is released independently.
Reference Type:
Including class, interface, array, delegate
Memory Allocation:
The instance is allocated to the managed stack and stores the memory reference of the instance data. GC (Garbage Collection) controls its Collection.
Special cases:
When nesting occurs, that is, the value type is nested reference type, and the reference type is nested value type, how is the memory allocated?
A value-type instance is always allocated to its declared location, and a reference-type instance is always allocated to the managed stack.
2. the sizeof () operator is used to obtain the size of the value type, but not applicable to the reference type.
3. The value type uses the new operator or the initial value to complete initialization, but the simple definition does not complete initialization. In this case, the reference to the member cannot be compiled
4. The performance of the reference type is less than that of the value type.
5. The value type is inherited from System. ValueType, and System. ValueType is inherited from System. Object.
6. The value type is closed and cannot be used as the base class of other types. However, it can be a single inheritance or multiple inheritance interfaces. The reference type generally has inheritance.
7. The value type is not polymorphism, but the reference type is polymorphism.
Mutual conversion between value types and reference types
Packing and unpacking
Pass by value and pass by reference:
Pass by value
Whether it is passing by reference type by value or passing by value type, it copies an object instance on the stack and transmits the new instance without changing the value of the original Instance.
Pass by reference
Directly transmits the reference address pointing to the instance. if the address is changed, the parameter value is changed.
The parameter address is passed.
When the value type is passed by reference, direct operation is performed on the Value Type parameter instance.
Both Ref and Out are passed by reference. The difference is that the parameter must have been initialized before the Ref parameter is passed, and the out parameter is not required for passing.
Implementation of custom type conversion:
Static access modifier operator conversion modifier operator type (parameter list)
All conversions must be static. See P160.
If a class object is declared pointing to a managed heap address, but the class object changes the reference, the previous address will be recycled by GC.
Packing and unpacking
Packing
Convert value type data to non-type reference object
Process:
1. Memory Allocation
2. Copy an instance
3. Return address (this step is not included, but often occurs together)
Unpack
Obtain the address of some fields from the value type in the boxed object,The execution does not include the copy process of fields.
Process:
1. instance check
2. pointer return
3. Copy Fields
Rules:
1. After unpacking, you must ensure that the execution result is of the type when it is not packed.
2. The reference type remains in the packing status. packing and unpacking are for the value type.
We should try to avoid box packing and unpacking. You can consider using generic
ArrayList, HashTable, and Emun are easy to cause packing.