程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 裝箱與拆箱性能損耗詳解

裝箱與拆箱性能損耗詳解

編輯:C#入門知識

拆箱是將引用類型轉換為值類型 ;反之,裝箱!

利用裝箱和拆箱功能,可通過允許值類型的任何值與Object 類型的值相互轉換,將值類型與引用類型鏈接起來 ;


[csharp]
例如: int val = 100;  
        object obj = val;  
           Console.WriteLine (“對象的值 = ",obj);  

例如: int val = 100;
     object obj = val;
           Console.WriteLine (“對象的值 = ",obj);
這是一個裝箱的過程,是將值類型轉換為引用類型的過程


[csharp]
  int val = 100; 
object obj = val;  
int num = (int) obj;  
Console.WriteLine ("num: ",num);<SPAN style="LINE-HEIGHT: 24px; FONT-FAMILY: arial, 宋體, sans-serif; FONT-SIZE: 14px"> </SPAN> 

    int val = 100;
 object obj = val;
 int num = (int) obj;
 Console.WriteLine ("num: ",num);
這是一個拆箱的過程,是將值類型轉換為引用類型,再由引用類型轉換為值類型的過程

顯然,從原理上可以看出,裝箱時,生成的是全新的引用對象,這會有時間損耗,也就是造成效率降低。看下面代碼

[csharp]
class Program 
   { 
       static void Main(string[] args) 
       { 
           //// 用時:00:00:01.6070325(跟電腦運行效率有一定關系)  
           //ArrayList list = new ArrayList();  
           //Stopwatch watch = new Stopwatch();  
           //watch.Start();  
           //for (int i = 0; i < 10000000; i++)  
           //{  
           ////使用ArrayList集合,每次增加一個數字都會發生裝箱操作。  
           //    list.Add(i);  
           //}  
           //watch.Stop();  
           //Console.WriteLine(watch.Elapsed);  
           //Console.ReadKey();/  
 
 
           //用時:00:00:00.1402388,使用泛型集合後,省去了裝箱與拆箱操作,性能大大提升。  
           List<int> list = new List<int>(); 
           Stopwatch watch = new Stopwatch(); 
           watch.Start(); 
           for (int i = 0; i < 10000000; i++) 
           { 
               list.Add(i); 
           } 
           watch.Stop(); 
           Console.WriteLine(watch.Elapsed); 
           Console.ReadKey(); 
       } 
   } 

 class Program
    {
        static void Main(string[] args)
        {
            //// 用時:00:00:01.6070325(跟電腦運行效率有一定關系)
            //ArrayList list = new ArrayList();
            //Stopwatch watch = new Stopwatch();
            //watch.Start();
            //for (int i = 0; i < 10000000; i++)
            //{
            ////使用ArrayList集合,每次增加一個數字都會發生裝箱操作。
            //    list.Add(i);
            //}
            //watch.Stop();
            //Console.WriteLine(watch.Elapsed);
            //Console.ReadKey();/


            //用時:00:00:00.1402388,使用泛型集合後,省去了裝箱與拆箱操作,性能大大提升。
            List<int> list = new List<int>();
            Stopwatch watch = new Stopwatch();
            watch.Start();
            for (int i = 0; i < 10000000; i++)
            {
                list.Add(i);
            }
            watch.Stop();
            Console.WriteLine(watch.Elapsed);
            Console.ReadKey();
        }
    }
總結:

            1.裝箱、拆箱必須是:值類型→引用類型  或  引用類型→值類型。

            object,接口。值類型是可以實現接口。

            Personp=new Student();//這個叫隱式類型轉換,不叫裝箱。

            Studentstu=(Student)p;//這個叫顯示類型轉換,不叫拆箱。

            int類型為什麼能裝箱到object類型,但不能裝箱到string類型或Person類型,

            因為object類型時int類型的父類。

            2.拆箱時,必須用裝箱時的類型來拆箱

            裝箱時如果是int,拆箱必須用int,不能用double

     3.方法重載時,如果具有該類型的重載,那麼就不叫拆箱或裝箱。 
  4.字符串連接 

 

[csharp]
string s1 = "a"; 
     string s2 = "b"; 
     int n3 = 10; 
     double d4 = 99.9; 
     string result = string.Concat(s1, s2, n3, d4); 

       string s1 = "a";
            string s2 = "b";
            int n3 = 10;
            double d4 = 99.9;
            string result = string.Concat(s1, s2, n3, d4);
[csharp]
<P style="LINE-HEIGHT: 80%; MARGIN-TOP: 2.88pt; unicode-bidi: embed; DIRECTION: ltr; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: baseline"><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 8pt">                 //string.Concat(s1,s2, n3, d4); </SPAN><SPAN style="FONT-FAMILY: 宋體; FONT-SIZE: 8pt">判斷是否發生了裝箱,及次數。 </SPAN></P>     

                 //string.Concat(s1,s2, n3, d4); 判斷是否發生了裝箱,及次數。                                反編譯IL代碼如下圖:  
 

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved