CLR vir C# 之基底類型,實值型別,參考型別

來源:互聯網
上載者:User

     基底類型

     之前有過這樣的疑惑:int 和System.Int32有什麼不同?實際上System.Int32是再FCL中的定義,多數編譯器對於此等類型都有自己的定義,他們和FCL中的定義自動建立映射關係。如C#中System.Int32就映射為int.

     所以我們可以很方便的用int i=10進行定義,實際上編譯為IL後,可以看到其以Int32的映射出現。

     FCL中的類型在C#都有對應的基元類型,但是在CLS中卻不一定有,如Sbyte,uint等。

     特別要注意的是:類型轉換時,如果大範圍向小範圍類型轉換,需要強制轉換,編譯器將做截斷處理;反之,可以安全的隱式轉換。

     Single s2 = 6.8F;
     Console.WriteLine((int)s2); //output:6

      

     Checked/UnChecked

     此關鍵字,用來對錶達式或語句塊進行安全性檢查。判斷運算是否有溢出產生。

     在IL中,每個運算子(+,-,*,/)都對應一對指令,如+對應Add和Add.ovf。調用後者時,將進行溢出檢查。

     這樣,我們在使用此關鍵字時,實際上調用了IL中對應的指令而已。

     溢出檢查動作將使得應用程式效能受到影響。     

     實值型別和參考型別

     1.結構體和枚舉類型屬於實值型別,其餘都為參考型別。

     2.參考型別儲存在託管堆上,同時需要儲存額外的資訊,受GC的控制。

     3.實值型別儲存線上程棧中,不受GC控制,出了範圍,自動釋放。

     4.實值型別的賦值和傳遞,需要進列欄位的複製和儲存,而參考型別只傳遞指標。

     通常在作為參數傳遞和作為傳回值傳遞時,如果資料過大,不易用實值型別。

     

     裝箱和拆箱

     實值型別有兩種狀態:裝箱狀態和拆箱狀態;參考型別只有一種:裝箱狀態。

     通常當實值型別作為參數傳遞時,而接受參數方接受參數類型為參考型別時,將發生裝箱作業。

     裝箱時:

     1.在託管堆分配實值型別欄位需要的記憶體,同時還要為附加資訊分配空間(類型對象指標,同步塊索引)。

     2.數值copy至堆中

     3.返回儲存指標

     可見,裝箱作業是非常消耗效能的。所以我們在寫程式過程中,應當儘可能避免裝箱情況的出現。net2.0出現的泛型,實際上一方面的原因就在於此。

     如:Console.WrileLine(12+"test")---> Console.WriteLine(12.ToString()+"test");之間的效能可測試。

     拆箱時:
      1.擷取已裝箱對象的各個欄位的地址。
      2.將這些欄位包含的值從堆中複製到基於堆棧的實值型別執行個體中。
      引用變數如果為null,拆箱時拋出NullRefernceException異常;拆箱時如果不能正確轉型,則拋出InvalidCastException異常。
      裝箱之前是什麼類型,拆箱時也要轉成該類型,轉成其基類或子類都不行。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.