c#中,數據類型主要分為2種,分別為值類型和引用類型。把值類型轉換為引用類型稱為裝箱,把引用類型轉換為值類型稱為拆箱。在c#中,值類型是在堆棧上分配內存的,而引用類型是在堆上分配內存的。裝箱的時候,CLR會為堆上的對象創建一個臨時的引用類型“box”。
該轉換是隱式進行的,如上面的例子所述。還可以手工進行轉換:
int i = 1;
object o = i;
而拆箱是顯示的,
int i = 20;?
bject o = i;
int j = (int)o;???
??????? 在c#2.0之前的版本中,考慮如下問題,ArrayList集合的Add方法接受的是bject類型,如果此時進入的是值類型,那么就會進行裝箱操作,如果從集合中取出數據,則還會進行相應的拆箱操作,現在觀察,如果在一個大的循環結構中,進行這種操作,毋庸置疑的,會對性能造成影響,因為拆裝箱本身就是要損失性能的。下面就分別使用泛型和不使用的情況進行代碼分析。事例很簡單,真實地業務環境會比這個復雜很多,再次僅僅表現出性能即可。
例子中聲明一個arraylist集合,首先是將1千萬個數字添加到集合中,然后再取出來,分別進行了裝箱和拆箱操作,
?
DateTime tbegin = DateTime.Now;
??????????? ArrayList list = new ArrayList();
??????????? for (int i = 1; i <= 10000000; i++)
??????????? ...{
??????????????? //System.Threading.Thread.Sleep(1);
??????????????? list.Add(i);
??????????? }
??????????? for (int j = 0; j < list.Count; j++)
??????????? ...{
??????????????? int s = (int)list[j];
??????????? }
??????????? DateTime tend = DateTime.Now;
??????????? TimeSpan ts = tbegin - tend;
??????????? Console.WriteLine(ts.ToString());
經過多次運行,取平均值,大約為3.9秒,下面的代碼適用泛型技術,應用了System.Collections.Generic命名空間下的泛型集合List<>,代碼如下:
DateTime tbegin = DateTime.Now;
??????????? List<int> list = new List<int>();
??????????? // ArrayList list = new ArrayList();
??????????? for (int i = 1; i <= 10000000; i++)
??????????? ...{
??????????????? //System.Threading.Thread.Sleep(1);
??????????????? list.Add(i);
??????????? }
??????????? for (int j = 0; j < list.Count; j++)
??????????? ...{
??????????????? int s = (int)list[j];
??????????? }
??????????? DateTime tend = DateTime.Now;
??????????? TimeSpan ts = tbegin - tend;
??????????? Console.WriteLine(ts.ToString());
經過多次運行得到一個平均值約為0.583,
可以輕松看出,應用泛型和沒有應用泛型時間差了近6.7倍。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/chenyuling/articles/1609660.aspx
?