欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 裝箱和拆箱的知識回顧

 更新時間:2016年12月19日 08:26:43   作者:反骨仔  
本篇文章主要介紹了C#的裝箱和拆箱的知識點回顧,對大家的學(xué)習(xí)和復(fù)習(xí)具有很好的參考價值,需要的朋友一起來看下吧

裝箱是將值類型轉(zhuǎn)換為 object 類型或由此值類型實現(xiàn)的任何接口類型的一個過程。 當(dāng) CLR 對值類型進行裝箱時,會將該值包裝到 System.Object 內(nèi)部,再將后者存儲在托管堆上。 拆箱將從對象中提取值類型。 裝箱是隱式的;拆箱是顯式的。 裝箱和拆箱的概念是類型系統(tǒng) C# 統(tǒng)一視圖的基礎(chǔ),其中任一類型的值都被視為一個對象。

在下面的示例中,將整型變量 i 進行了裝箱并分配給對象 obj。

static void Main(string[] args)
  {
   var i = 123; //System.Int32
   //對 i 裝箱(隱式)
   object obj = i;
   Console.Read();
  }

然后,可以將對象 obj 拆箱并分配給整型變量 i。

static void Main(string[] args)
  {
   var i = 123; //System.Int32
   //對 i 裝箱(隱式)
   object obj = i;
   //對 obj 進行拆箱(顯式)
   i = (int)obj;
   Console.Read();
  }

這里用代碼進行演示裝箱拆箱操作:

static void Main(string[] args)
  {
   //使用 string.Format 演示裝箱的使用,在這里 24 會被進行裝箱操作
   var formatStr = string.Format("{0} {1}.", "I'm", 24);
   Console.WriteLine($"formatStr: {formatStr}");
   var objs = new List<object>();
   for (int i = 0; i < 5; i++)
   {
    //每一次 i 都會裝箱到 objs 中
    objs.Add(i);
   }
   Console.WriteLine("==========");
   foreach (var obj in objs)
   {
    //兩個 object 類型不能直接使用 * ,需要使用 int 進行顯式拆箱
    Console.WriteLine($"{obj} * {obj} = {(int)obj * (int)obj}");
   }
   Console.Read();
  }

性能

相對于簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。對值類型進行裝箱時,必須分配并構(gòu)造一個新對象。拆箱所需的強制轉(zhuǎn)換也需要進行大量的計算,只是程度較輕。如果你的操作正處于循環(huán)的中心,你會很明顯的感覺到性能問題。

裝箱 

裝箱用于在堆中存儲值類型。 裝箱是值類型到 object 類型或到此值類型所實現(xiàn)的任何接口類型的隱式轉(zhuǎn)換。對值類型裝箱會在堆中分配一個對象實例,并將該值復(fù)制到新的對象中。

請看以下值類型變量的聲明:

var i = 123;    //System.Int32

以下語句對變量 i 隱式應(yīng)用了裝箱操作:

 //對 i 裝箱(隱式)進對象 obj
 object obj = i;

此語句的結(jié)果是在堆棧上創(chuàng)建對象引用 o,而在堆上則引用 int 類型的值。 該值是賦給變量 i 的值類型值的一個副本。 下圖說明了兩個變量 i 和 o之間的差異。

當(dāng)然,你也可以選擇執(zhí)行顯式裝箱,但顯式裝箱從來不是必需的。

拆箱

拆箱是從 object 類型到值類型或從接口類型到實現(xiàn)該接口的值類型的顯式轉(zhuǎn)換。 拆箱的操作包括:

檢查對象實例,以確保它是給定值類型的裝箱值。

將該值從實例復(fù)制到值類型變量中。

   int i = 123;  // 值類型
   object o = i;  // 裝箱
   int j = (int)o; // 拆箱

要在運行時成功拆箱值類型,被拆箱的項必須是對一個對象的引用,該對象是先前通過裝箱該值類型的實例創(chuàng)建的。 嘗試取消裝箱 null 會導(dǎo)致 NullReferenceException。 嘗試取消裝箱對不兼容值類型的引用會導(dǎo)致 InvalidCastException。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • c# 用ICSharpCode組件壓縮文件

    c# 用ICSharpCode組件壓縮文件

    今天,主要總結(jié)下,windows平臺下,zip的壓縮與解壓的方法,用ICSharpCode組件,有此需求的朋友可以參考下本文
    2021-06-06
  • C#實現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法

    C#實現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法

    這篇文章主要介紹了C#實現(xiàn)char字符數(shù)組與字符串相互轉(zhuǎn)換的方法,結(jié)合實例形式簡單分析了C#字符數(shù)組轉(zhuǎn)字符串及字符串轉(zhuǎn)字符數(shù)組的具體實現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • Unity3D實現(xiàn)描邊框效果

    Unity3D實現(xiàn)描邊框效果

    這篇文章主要為大家詳細(xì)介紹了Unity3D實現(xiàn)描邊框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 淺析C#中靜態(tài)方法和非靜態(tài)方法的區(qū)別

    淺析C#中靜態(tài)方法和非靜態(tài)方法的區(qū)別

    C#靜態(tài)方法與非靜態(tài)方法的區(qū)別不僅僅是概念上的,那么他們有什么具體的區(qū)別呢?讓我們通過本文向大家介紹下C#中靜態(tài)方法和非靜態(tài)方法的區(qū)別,一起看看吧
    2017-09-09
  • Unity UGUI LayoutRebuilder自動重建布局介紹及使用

    Unity UGUI LayoutRebuilder自動重建布局介紹及使用

    這篇文章主要為大家介紹了Unity UGUI LayoutRebuilder自動重建布局介紹及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • C#環(huán)形隊列的實現(xiàn)方法詳解

    C#環(huán)形隊列的實現(xiàn)方法詳解

    這篇文章先是簡單的給大家介紹了什么是環(huán)形隊列和環(huán)形隊列的優(yōu)點,然后通過實例代碼給大家介紹C#如何實現(xiàn)環(huán)形隊列,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • C# SendMail發(fā)送郵件功能實現(xiàn)

    C# SendMail發(fā)送郵件功能實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C# SendMail發(fā)送郵件功能實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C# cmd中修改顯示(顯示進度變化效果)的方法

    C# cmd中修改顯示(顯示進度變化效果)的方法

    好多人想在運行或者調(diào)試含有大量數(shù)據(jù)或者比較慢C#程序的時候能夠顯示自己的程序完成的程度,這里有一個方法能發(fā)不斷地修改cmd的同一行,以達(dá)到顯示完成百分比的目的
    2013-04-04
  • 在web.config和app.config文件中增加自定義配置節(jié)點的方法

    在web.config和app.config文件中增加自定義配置節(jié)點的方法

    本篇文章主要是對在web.config和app.config文件中增加自定義配置節(jié)點的方法進行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • Unity中協(xié)程IEnumerator的使用方法介紹詳解

    Unity中協(xié)程IEnumerator的使用方法介紹詳解

    本文主要介紹了Unity中協(xié)程IEnumerator的使用方法介紹詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論