1. 程式人生 > >.net裝箱和拆箱

.net裝箱和拆箱

//裝箱:值型別→引用型別
            //拆箱:引用型別→值型別
            //裝箱拆箱轉化,n在意義上本身就是屬於object型別的,只是在o對應的對記憶體中複製了一個n存進去,這種轉化叫裝箱
            int n = 10;
            object o = n;
            int m = (int)o;

            //不屬於裝箱拆箱的轉化,tring與int在記憶體存在形式上是不同的,這種雖然也是把值型別轉化為引用型別,但是,這種方式是先在堆記憶體上開闢一個空間,然後儲存一個string型的”10”,然後再把地址給str,這種不叫裝箱
            int i = 20;
            string str = Convert.ToString(i);
            int y = int.Parse(str);

            //3、裝箱和拆箱:必須是在記憶體方面存在的形式相同的轉化才叫拆裝箱,也就是子父類之間的轉換,裝的時候是什麼型別裝的箱,拆的時候也必須是同樣的型別接受,否則會錯
            //int q = 30;
            //object oo = q;
            //double d = (double)oo;
          
            //int實現了IComParable介面,所以也是裝箱拆箱
            int x = 100;
            IComparable ic = x;
            int w = (int)ic;
            char ch = 's';
            string ch2 = "w";
            int n1 = 10;
            double d2 = 19;
            string r = string.Concat(ch, ch2, n1, d2);
            Console.WriteLine(r);

            #region 頻繁發生拆箱和裝箱和消耗時間、資源
            
            ArrayList arr = new ArrayList();
            Stopwatch sw = new Stopwatch();
            sw.Start();////00:00:01.7436891時間
            for (int ii = 0; ii < 10000000; ii++)
            {
                arr.Add(ii);
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);

            sw.Restart();
            sw.Start();
            //時間00:00:00.4028327
            List<int> list = new List<int>();
            for (int ii = 0; ii < 10000000; ii++)
            {
                list.Add(ii);
            }
            sw.Stop();
            Console.WriteLine(sw.Elapsed);
            #endregion   
            
            Console.ReadKey();