国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

再談C#的裝箱和拆箱

2019-11-17 03:28:47
字體:
來源:轉載
供稿:網友

上一篇寫了一下裝箱拆箱的定義和IL分析,這一篇我們看下使用泛型和不使用泛型引發裝箱拆箱的情況

1. 使用非泛型集合時引發的裝箱和拆箱操作

看下面的一段代碼:

view sourcePRint?1 var array = new ArrayList(); 

2 array.Add(1); 

3 array.Add(2); 

4   

5 foreach (int value in array) 

6 { 

7 Console.WriteLine(“value is {0}”,value); 

8 }

代碼聲明了一個ArrayList對象,向ArrayList中添加兩個數字1,2;然后使用foreach將ArrayList中的元素打印到控制臺。

在這個過程中會發生兩次裝箱操作和兩次拆箱操作,在向ArrayList中添加int類型元素時會發生裝箱,在使用foreach枚舉ArrayList中的int類型元素時會發生拆箱操作,將object類型轉換成int類型,在執行到Console.WriteLine時,還會執行兩次的裝箱操作;這一段代碼執行了6次的裝箱和拆箱操作;如果ArrayList的元素個數很多,執行裝箱拆箱的操作會更多。

你可以通過使用ILSpy之類的工具查看IL代碼的box,unbox指令查看裝箱和拆箱的過程

2. 使用泛型集合的情況

請看如下代碼:

view sourceprint?var list = new List<int>(); 

list.Add(1); 

list.Add(2); 

  

foreach (int value in list) 

Console.WriteLine("value is {0}", value); 

}

代碼和1中的代碼的差別在于集合的類型使用了泛型的List,而非ArrayList;我們同樣可以通過查看IL代碼查看裝箱拆箱的情況,上述代碼只會在Console.WriteLine()方法時執行2次裝箱操作,不需要拆箱操作。

可以看出泛型可以避免裝箱拆箱帶來的不必要的性能消耗;當然泛型的好處不止于此,泛型還可以增加程序的可讀性,使程序更容易被復用等等。

本文使用的C#代碼如下:

show sourceview sourceprint?01 using System; 

02 using System.Collections; 

03 using System.Collections.Generic; 

04   

05 namespace boxOrUnbox 

06 { 

07     class Program 

08     { 

09         static void Main(string[] args) 

10         { 

11             //do nothing 

12         } 

13   

14         static void Box() 

15         { 

16             object objValue = 9; 

17         } 

18   

19         static void Unbox() 

20         { 

21             object objValue = 4; 

22             int value = (int)objValue; 

23         } 

24   

25         static void LookatArrayList() 

26         { 

27             var array = new ArrayList(); 

28             array.Add(1); 

29             array.Add(2); 

30   

31             foreach (int value in array) 

32             { 

33                 Console.WriteLine("value is {0}", value); 

34             } 

35         } 

36   

37         static void LookatGenericList() 

38         { 

39             var list = new List<int>(); 

40             list.Add(1); 

41             list.Add(2); 

42   

43             foreach (int value in list) 

44             { 

45                 Console.WriteLine("value is {0}", value); 

46             } 

47         } 

48     } 

49 }

C#的IL代碼如下:

show sourceview sourceprint?


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通城县| 灵山县| 陇川县| 柘荣县| 洞口县| 保亭| 封丘县| 台东市| 平邑县| 民和| 丰顺县| 恩平市| 福州市| 石狮市| 镇江市| 泾川县| 涪陵区| 东城区| 临沭县| 金坛市| 枣强县| 芦山县| 正镶白旗| 永年县| 英山县| 三台县| 刚察县| 濉溪县| 南通市| 衡水市| 崇礼县| 大同县| 开阳县| 耒阳市| 江门市| 承德县| 永昌县| 周宁县| 建昌县| 濉溪县| 前郭尔|