C#中的裝箱與拆箱


現在已經很少使用ArrayList與Hashtable,除去取數據不方便之外,在加入元素以及其余操作時,花費的時間也是比較多的,效率低;對其解釋涉及到裝箱和拆箱的問題;

一、什么是裝箱和拆箱

裝箱:將數值類型轉換成引用類型的值

拆箱:將引用類型轉換成數值類型

int n = 10;
            object o = n;//裝箱

            int nn = (int)o;//拆箱

 

二、裝箱與拆箱的判別

string str = "123";
            int a = Convert.ToInt32(str);

上述代碼,雖然是由引用類型轉換成值類型;但是並沒有發生任何的裝箱和拆箱的操作;

首先應該判斷兩者是否是繼承關系,在判斷是否是拆箱和裝箱;上述代碼中,string類型與Int類型並不是繼承關系,所以不存在裝箱和拆箱的關系;

 int b = 1233;
            IComparable c = b;

上述代碼發生了裝箱,首先int類型與IComparable類型是繼承關系;int繼承IComparable,又是由值類型轉換成引用類型,所以發生了裝箱;

三、檢驗裝箱操作的效率

第一組:

ArrayList arraylist = new ArrayList();
            
            Stopwatch sw = new Stopwatch();
            sw.Start();
            
            for (int i=0;i<1000000;i++)
            {
                arraylist .Add(i);
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

輸出:00:00:00.0427016

第二組:

            List<int> list = new List<int>();
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i=0;i<1000000;i++)
            {
                list.Add(i);
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

輸出:00:00:00.0111906

第一組代碼耗時長一些,因為發生了裝箱;arrayList.Add();中的參數是Object類型的,輸入的是int類型,所以發生了由值類型到引用類型的轉換;

所以以后在寫代碼的過程中,盡量避開裝箱和拆箱操作,這樣會降低效率;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM