从C#中的ArrayList和List的区别说起
原题地址:https://blog.****.net/u010133610/article/details/64907343
关于ArrayList和List的区别的这道题,基本都翻了。
原因很简单,这道题在所有网上能找到的Unity程序面试题中都有,但是很不幸,答案是错误的。
首先,我们从数组说起,数组是一种高效的但是不太方便的数据存储方式,之所以不方便,是因为固定长度无法修改。
于是为了充分利用内存,就有了动态数组的概念。
C#中动态数组的实现就是集合接口IList。ArrayList和List都继承了接口IList(不知道是哪位“高人”让网上流传着 List是接口 的概念...)
再来讲一下ArrayList,据了解,有些人喜欢用ArrayList是因为对存储对象的类型没有要求,用起来方便。这时我就想问一句:你在取数据的时候也很方便吗???
如下图:
ArrayList之所以对类型没有要求,是因为ArrayList中存储的类型都是object类型,而其他类型与object类型进行转换的过程就会产生拆箱装箱,拆箱装箱又是一笔不能忽视的开销。
伴随而来的就是类型的不安全。如果是熟悉动态语言的朋友,可能觉得没什么,但是类型安全在静态语言中还是非常重要的。
而List泛型在声明时就已经限制了存储内容的数据类型,所以不存在跟object类型的转换也就没有了装箱和拆箱的操作,并且是类型安全的。所以,在平时的使用中,如果只是为了使用动态数组,那么就不要考虑ArrayList了。
最后贴一段正确的使用代码
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class Test : MonoBehaviour {
- private void Start()
- {
- TestA();
- TestB();
- }
- private void TestA()
- {
- ArrayList array = new ArrayList();
- array.Add("123");
- array.Add(123);
- try
- {
- int value = (int)array[0];
- Debug.Log("TestA value:"+value);
- }
- catch (System.Exception e)
- {
- Debug.LogError("错误:" + e);
- }
- }
- private void TestB()
- {
- List<int> list = new List<int>();
- list.Add(123);
- int value = list[0];
- Debug.Log("TestB value:" + value);
- }
- }
执行结果如下: