ArrayList vs List <> in C#

ArrayListList<>在C#中有什么区别?

只有List<>有一个types,而ArrayList没有?

是的,非常多。 List<T>是一个generics类。 它支持存储特定types的值,而不会向object转换或从object (当TArrayList情况下的值types时,会产生装箱/拆箱开销)。 ArrayList只是存储object引用。 作为一个通用的集合, List<T>实现了通用的IEnumerable<T>接口,并且可以在LINQ中轻松使用(不需要任何CastOfType调用)。

ArrayList属于C#没有generics的日子。 它不赞成使用List<T> 。 你不应该在目标.NET> = 2.0的新代码中使用ArrayList ,除非你必须与使用它的旧API接口。

使用List<T>可以防止转换错误。 避免运行时转换错误非常有用。

例:

这里(使用ArrayList )你可以编译这个代码,但是你稍后会看到一个执行错误。

 ArrayList array1 = new ArrayList(); array1.Add(1); array1.Add("Pony"); //No error at compile process int total = 0; foreach (int num in array1) { total += num; //-->Runtime Error } 

如果使用List ,则可以避免这些错误:

 List<int> list1 = new List<int>(); list1.Add(1); //list1.Add("Pony"); //<-- Error at compile process int total = 0; foreach (int num in list1 ) { total += num; } 

参考: MSDN

添加到以上几点。 在64位操作系统中使用ArrayList比在32位操作系统中使用2倍的内存。 同时,通用列表List<T>将使用比ArrayListless得多的内存。

例如,如果我们在32位使用19MB的ArrayList ,则64位需要39MB。 但是,如果你有一个32位的8MB的generics列表List<int> ,那么在64位中只需要8.1MB,与ArrayList相比,这是一个481%的差异。

源: ArrayList与基本types和64位的generics列表

另一个不同之处在于线程同步。

ArrayList通过Synchronized属性提供了一些线程安全性,它在集合周围返回一个线程安全的包装。 包装器通过在每个添加或删除操作上locking整个集合来工作。 因此,试图访问集合的每个线程都必须等待轮到锁。 这不可扩展,并可能导致大型集合显着的性能下降。

List<T>不提供任何线程同步; 当多个线程同时添加或删除项目时,用户代码必须提供所有同步。

更多信息.Net框架中的线程同步

ArrayList不是types安全的,而List是types安全的。 简单:)。

ArrayList是不同types数据的集合,而List<>是它自己的依赖的类似types的集合。

使用“列表”你可以防止铸造错误。 避免运行时转换错误非常有用。

例:

这里(使用ArrayList)你可以编译这个代码,但是你稍后会看到一个执行错误。

  // Create a new ArrayList System.Collections.ArrayList mixedList = new System.Collections.ArrayList(); // Add some numbers to the list mixedList.Add(7); mixedList.Add(21); // Add some strings to the list mixedList.Add("Hello"); mixedList.Add("This is going to be a problem"); System.Collections.ArrayList intList = new System.Collections.ArrayList(); System.Collections.ArrayList strList = new System.Collections.ArrayList(); foreach (object obj in mixedList) { if (obj.GetType().Equals(typeof(int))) { intList.Add(obj); } else if (obj.GetType().Equals(typeof(string))) { strList.Add(obj); } else { // error. } } 

对我来说,了解你的数据。 如果我继续在效率的基础上扩展我的代码,那么我将不得不selectList选项作为破解我的数据的一种方式,而不是总是对types特别是“自定义types”感到疑惑的不必要的步骤。 如果机器理解差异,并可以确定实际处理的数据types,那么为什么我应该花时间和浪费时间通过“如果其他”的决定? 我的理念是让机器为我工作而不是在机器上工作? 了解不同目标代码命令的独特差异,可以使您的代码高效运行。

汤姆·约翰逊(一进一出)

这不仅是差异。 ArrayList成员可以像普通数组一样通过索引来访问,并且ArrayList成员也可以很容易地按正向和反向顺序sorting,两个ArrayList可以很容易地合并,而简单的List则不是这样。 查看更多

http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html