《CLR.via.C#第三版》第二部分第4,5章節讀書筆記(二)

來源:互聯網
上載者:User

標籤: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章節讀書筆記(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.