These two chapters are all theoretical, and I don't think I need to be too much of a blind alley. The theory of this thing, only in the long-term practice to slowly understand will be profound. I'll just write down some key knowledge that I think is important.
(i) Type conversion
Knowledge Points: Conversions to a base type are considered to be a safe, implicit conversion; When you convert to a derived type, only transformations are displayed.
Example:
New= (Employee) o;
Important cognition: The CLR's type checking iterates through the inheritance hierarchy and checks the specified type with each base type.
Common code: (see Code snippet below.) The CLR checks the type of objects two times):
if is Employee) { = (Employee) o; }
Simplify the code: (see Code snippet below.) The CLR checks the type of the object at a time)
as Employee; if NULL ){ //...}
(ii) value types and reference types
Important cognition: 1. The stack stores a value type, a pointer to a reference type (address), and a heap in which the reference type itself is stored (not all, see 2).
2. Value types that are contained within a reference type are not stored in the stack, but are in the heap (or value types, not boxed) and are included in the reference type object.
(iii) Attention to the impact of boxing and unpacking on program performance
Understand the three-time boxing in the following code:
Public Static void Main () { Int32 v=5; =V; V=123; " " + (Int32) o);}
The first boxing is to convert V to object; the second and third is because the WriteLine () method takes a string object so that V and the unpacking o are re-boxed.
What happens in "boxing":
1. Allocating memory in the managed heap, including the amount of memory required by the value Type field + The amount of memory for the type object pointer + memory required for the synchronization block index.
2. The value type of the field is copied to the newly allocated heap memory.
3. Returns the address of the object. (Address is a reference (pointer) to an object, and a value type becomes a reference type)
Concept application:
Override the ToString () method in the class to avoid boxing problems when using the ToString () method.
Public class a{ privateint x; Public Override String ToString () { returnstring. Formart ("{0}", x);} }
Note Override the ToString () method internally if the base is called. ToString (); When this method is called externally, the value type is still boxed.
"Clr.via.c# Third Edition" Part II 4th, Chapter 5 reading notes (ii)