从C#中的ArrayList和List的区别说起

原题地址:https://blog.****.net/u010133610/article/details/64907343

关于ArrayList和List的区别的这道题,基本都翻了。

原因很简单,这道题在所有网上能找到的Unity程序面试题中都有,但是很不幸,答案是错误的。


首先,我们从数组说起,数组是一种高效的但是不太方便的数据存储方式,之所以不方便,是因为固定长度无法修改。

于是为了充分利用内存,就有了动态数组的概念。

C#中动态数组的实现就是集合接口IList。ArrayList和List都继承了接口IList(不知道是哪位“高人”让网上流传着  List是接口  的概念...)

从C#中的ArrayList和List的区别说起

再来讲一下ArrayList,据了解,有些人喜欢用ArrayList是因为对存储对象的类型没有要求,用起来方便。这时我就想问一句:你在取数据的时候也很方便吗???

如下图:

从C#中的ArrayList和List的区别说起

ArrayList之所以对类型没有要求,是因为ArrayList中存储的类型都是object类型,而其他类型与object类型进行转换的过程就会产生拆箱装箱,拆箱装箱又是一笔不能忽视的开销。

伴随而来的就是类型的不安全。如果是熟悉动态语言的朋友,可能觉得没什么,但是类型安全在静态语言中还是非常重要的。


而List泛型在声明时就已经限制了存储内容的数据类型,所以不存在跟object类型的转换也就没有了装箱和拆箱的操作,并且是类型安全的。所以,在平时的使用中,如果只是为了使用动态数组,那么就不要考虑ArrayList了。


从C#中的ArrayList和List的区别说起


最后贴一段正确的使用代码

[csharp] view plain copy
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using UnityEngine;  
  4.   
  5. public class Test : MonoBehaviour {  
  6.   
  7.     private void Start()  
  8.     {  
  9.         TestA();  
  10.         TestB();  
  11.     }  
  12.   
  13.     private void TestA()  
  14.     {  
  15.         ArrayList array = new ArrayList();  
  16.         array.Add("123");  
  17.         array.Add(123);  
  18.   
  19.         try  
  20.         {  
  21.             int value = (int)array[0];  
  22.             Debug.Log("TestA value:"+value);  
  23.         }  
  24.         catch (System.Exception e)  
  25.         {  
  26.             Debug.LogError("错误:" + e);  
  27.         }  
  28.     }  
  29.   
  30.     private void TestB()  
  31.     {  
  32.         List<int> list = new List<int>();  
  33.         list.Add(123);  
  34.   
  35.         int value = list[0];  
  36.         Debug.Log("TestB value:" + value);  
  37.     }  
  38. }  

执行结果如下:

从C#中的ArrayList和List的区别说起