標籤:style blog color ar os 使用 sp for div
這兩章全是理論性的東西,我覺得不必過於鑽牛角尖。理論這東西,只有在長期的實踐中去慢慢領悟才會深刻。下面我唯寫些我認為重要的關鍵知識。
(一)類型轉換
知識點:向基底類型的轉換被認為是一種安全的隱式轉換;向衍生類別型轉換時,只能顯示轉換。
舉例:
Object o = new Employee();Employee e = (Employee)o;
重要認知:CLR的類型檢查會遍曆繼承階層,用每個基底類型去核對指定的類型。
常用代碼:(見下方程式碼片段。CLR會檢查兩次對象的類型):
if(o is Employee){ Employee e = (Employee)o; }
簡化代碼:(見下方程式碼片段。CLR會檢查一次對象的類型)
Employee e = o as Employee;if(e != null){ //...}
(二)實值型別和參考型別
重要認知:1.棧中儲存的是實值型別、參考型別的指標(地址);堆中儲存參考型別本身(不全是,見2)。
2.包含在參考型別內的實值型別不會被儲存在棧中,而是堆中(還是實值型別,未被裝箱),它被包含於參考型別對象中。
(三)重視裝箱和拆箱對程式效能的影響
理解以下代碼中的三次裝箱:
public static void Main(){ Int32 v=5; Object o =v; v=123; Console.WriteLine(v + ", " + (Int32)o );}
第一次裝箱是將v轉換成object對象;第二次和第三次是因為WriteLine()方法要擷取一個String對象,這樣v和被拆箱的o會被再次裝箱。
“裝箱”發生的事情:
1. 在託管堆中分配記憶體,包括實值型別欄位需要的記憶體量+類型對象指標的記憶體量+同步塊索引需要的記憶體量。
2. 實值型別的欄位複製到新分配的堆記憶體。
3. 返回對象的地址。(地址是對對象的引用(指標),實值型別變成參考型別)
概念應用:
重寫類中的ToString()方法,可以避免使用ToString()方法時的裝箱問題。
public class A{ private int x; public override String ToString() { return string.formart("{0}",x); }}
注意重寫的ToString()方法內部如果調用了base.ToString();外部調用此方法時,實值型別依然會被裝箱。
《CLR.via.C#第三版》第二部分第4,5章節讀書筆記(二)