何时在c#中使用ArrayList而不是array []?

时间:2009-01-05 11:07:29

标签: c# arrays arraylist

我经常使用ArrayList代替'普通'array[]

当我使用ArrayList时,我觉得好像在欺骗(或者懒惰),什么时候可以在数组上使用ArrayList

11 个答案:

答案 0 :(得分:60)

数组是强类型的,并且可以作为参数使用。如果您知道集合的长度并且已修复,则应使用数组。

ArrayLists不是强类型的,每次Insertion或Retrial都需要强制转换才能恢复原始类型。如果您需要一个方法来获取特定类型的列表,ArrayLists就会失败,因为您可以传入包含任何类型的ArrayList。 ArrayLists在内部使用动态扩展数组,因此当内部数组达到其容量时,也会有一个扩展来扩展内部数组的大小。

您真正想要使用的是List<T>之类的通用列表。这具有Array和ArrayLists的所有优点。它是强类型的,它支持可变长度的项目。

答案 1 :(得分:14)

除了鲍勃和弗雷德里克的回应之外,我想指出的是,虽然数组有协方差,但通用列表却没有。例如,MyChildClass[]类型的数组可以轻松地投放到MyParentClass[],而List<MyChildClass>无法投放到List<MyParentClass>,至少不能直接投放到{{1}}。

如果您需要协方差,请使用数组,使用LINQ的Cast()方法或其他方法单独转换每个项或等待C#4

答案 2 :(得分:7)

另一个想法是变异;数组(T[])完全可变,无法保护。 List<T>没有提供任何有用的扩展点,但Collection<T>(或许多其他IList<T>实现)之类的内容允许您添加代码,例如,在添加项目之前检查项目;同样,您可以拥有只读IList<T>实现,这对于需要不变性的线程安全非常有用。

我倾向于在内部方法逻辑中使用数组(可能作为局部变量),作为params参数,或者在一些高度优化的情况下使用数据,我知道项目的长度,我知道代码选择不要改变它(作为私有字段)。除此之外,List<T>等往往更常见,因为它们在添加/删除项目时的开销要小得多。

答案 3 :(得分:5)

除非这部分代码对性能至关重要,否则使用ArrayList非常好。

答案 4 :(得分:4)

更好的是,无论您在何处使用ArrayList,请使用List<T>通用集合。它的输入类型比前者更强。

答案 5 :(得分:1)

我是从Java角度回答这个问题,但这是基本相同的问题。你不应该使用更高的抽象感到内疚。毕竟,您使用的是String而不是char[],甚至是byte[]?我甚至建议更进一步,尽可能使用List接口。一步到位的唯一原因是出于性能原因。

使用更高的集合抽象有许多优点。您可以添加装饰器以使List成为只读,使其成为固定大小,检查进入或离开集合的项目或使用视图(请参阅C#中的GetRange和Java中的subList。“

顺便说一下,ArrayList应始终基于原始数组,否则名称错误。这些操作通常按照您在使用基本数组时的预期实现。如果使用链接列表,通常将其命名为 - LinkedList。这也是使用界面的一个优点:您可以稍后改变您对使用过的实现的想法。

有一些东西使收藏品使用笨重。需要注意的是,集合通常基于对象,并且语言在原始类型和对象类型之间存在相当大的差距。有限的泛型也没有多大帮助。不过,除非有充分的理由,否则我建议使用数组。

对于原始值,您还可以考虑使用原始集合库,例如GNU Trove。不过,不知道C#是否有类似的东西。

答案 6 :(得分:1)

Fabulous Adventures In Coding撰写了一篇文章Arrays considered somewhat harmful。这是一个非常有趣的阅读。

答案 7 :(得分:0)

对于一个,如果您只打算处理特定类型,则不应使用ArrayList。例如,如果您只需要一个字节数组,那么您应该只接受一个字节数组。

只有我认为您甚至可能会想到使用ArrayList而不是List。

答案 8 :(得分:0)

数组的大小是静态的,因此如果您在设计时知道大小,请使用数组。它应该更快,但我没有自己测试。如果您需要经常更改对象的数量(在集合中添加或删除对象),请使用ArrayList或更好的.NET 2中的通用List。它也更易于使用,因此如果性能不是至关重要,您可以始终使用List。

答案 9 :(得分:0)

如果您需要一个基本类型数组,请使用Array以获得更好的性能,因为它可以避免自动装箱和取消装箱。但前提是你要提前知道你想要的尺寸。

答案 10 :(得分:0)

就像这样。

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}