我经常使用 anArrayList
而不是 'normal' array[]
。
当我使用 an 时,我觉得自己在作弊(或懒惰) ,什么时候可以在数组ArrayList
上使用 an ?ArrayList
数组是强类型的,可以很好地用作参数。如果您知道集合的长度并且它是固定的,则应该使用数组。
ArrayList 不是强类型的,每次插入或重试都需要强制转换才能恢复到原始类型。如果您需要一种方法来获取特定类型的列表,那么 ArrayLists 就不够用了,因为您可以传入包含任何类型的 ArrayList。ArrayLists 在内部使用动态扩展数组,因此当内部数组达到其容量时,也有一个扩展内部数组大小的问题。
您真正想要使用的是一个通用列表,例如List<T>
. 这具有 Array 和 ArrayLists 的所有优点。它是强类型的,它支持可变长度的项目。
除了 Bob 和 Frederick 的回应,我想指出,虽然数组具有协方差,但泛型列表没有。例如,类型数组MyChildClass[]
可以很容易地转换为MyParentClass[]
,而List<MyChildClass>
不能转换为List<MyParentClass>
,至少不能直接转换为 。
如果您需要协方差,请使用数组、使用 LINQ 的 Cast() 方法或其他方法来单独转换每个项目或等待 C# 4。
这里的另一个想法是突变。数组 ( T[]
) 是完全可变的,不能被保护。List<T>
不提供任何有用的扩展点,但是Collection<T>
(或许多其他IList<T>
实现)之类的东西允许您添加代码,例如,在添加项目之前检查它们;同样,您可以拥有只读IList<T>
实现,这对于需要不可变性的线程安全很有用。
我倾向于在内部方法逻辑(可能作为局部变量)中使用数组,作为params
参数,或者在一些高度优化的情况下,我知道项目的长度,并且我知道代码选择不改变它(作为私人领域)。除此之外,List<T>
等往往更常见,因为在添加/删除项目时它们的开销要少得多。
除非这部分代码对性能非常关键,否则使用 ArrayList 是非常好的。
更好的是,无论你在哪里使用ArrayList
,都可以使用List<T>
泛型集合。它的类型比前者更强。
我从 Java 的角度回答这个问题,但这是相同的基本问题。你不应该因为使用更高的抽象而感到内疚。毕竟,您使用的是String
s 而不是char[]
,甚至是byte[]
? 我什至建议更进一步,并List
尽可能使用该界面。降级的唯一原因是出于性能原因。
使用更高的集合抽象有很多优点。您可以添加装饰器以使列表成为只读,使其大小固定,检查进入或离开集合的项目或使用视图(参见GetRange
C# 和subList
Java。)
顺便说一句,anArrayList
应该始终基于原始数组,否则名称是错误的。这些操作通常按照您在使用原始数组时所期望的方式实现。如果使用链表,它通常命名为 -- LinkedList
。这也是使用接口的一个优势:您可以稍后改变对使用的实现的看法。
有一些事情使集合的使用变得笨拙。需要注意的是,集合通常基于对象,并且语言在原始类型和对象类型之间存在相当大的差距。有限的泛型也没有多大帮助。尽管如此,除非有充分的理由,否则我推荐集合而不是数组。
对于原始值,您还可以考虑使用原始集合库,例如GNU Trove。不过,不知道 C# 是否有类似的东西。
Fabulous Adventures In Coding写了一篇Arrays 被认为有些有害的文章。这真是一本有趣的书。
好吧,如果您只打算处理特定类型,则不应使用 ArrayList。例如,如果您只期望一个字节数组,那么您应该只接受一个字节数组。
只有一次我认为您甚至可能会想到使用 ArrayList 来代替 List。
数组的大小是静态的,所以如果您在设计时知道大小,请使用数组。它应该工作得更快,但我自己没有测试过。如果您需要经常更改对象的数量(从集合中添加或删除对象),请使用 ArrayList 或更好的 .NET 2 中的通用 List。它也更易于使用,因此如果性能不重要,您始终可以使用 List。
如果您需要原始类型数组,请使用 Array 以获得更好的性能,因为它将避免自动装箱和拆箱。但前提是你提前知道你想要的尺寸。
就像这样。
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();
}
}
}