這兩章全是理論性的東西,我覺得不必過於鑽牛角尖。理論這東西,只有在長期的實踐中去慢慢領悟才會深刻。下面我只寫些我認為重要的關鍵知識。
(一)類型轉換
知識點:向基類型的轉換被認為是一種安全的隱式轉換;向派生類型轉換時,只能顯示轉換。
舉例:
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();外部調用此方法時,值類型依然會被裝箱。
第一次看感覺好難,但硬著頭皮看下去後,感覺又不是很難了,從這本書可以學習到更多的知識,用Keni的話,這是一本入門的書,因為讀完後,你會有很多的疑問,帶著這些......
是這本,要的哈,加俺
《CLRviaC#》 作者:(美)瑞奇特著 頁數:778 出版日期:2010.09 簡介:本書針對CLR和.NET Framework 4.0進行深入、全面的探討,並結合實例介紹了如何利用它們進行設計、開發和調試。全書5部分29章。第Ⅰ部分介紹CLR基礎,第Ⅱ部分解釋如何設計類型,第Ⅲ部分...