33

我基本上想知道在下面提到的场景中使用通用列表而不是数组的区别或优势

class Employee
{
    private string _empName;

    public string EmpName
    {
       get{ return _empName; }
       set{ _empName = value; }
    }
}

1. Employee[] emp 
2. List<Employee> emp

谁能告诉我优点或缺点以及更喜欢哪一个?

4

7 回答 7

21

一个很大的区别是List<Employee>可以扩展(您可以对其调用 Add)或收缩(您可以对其调用 Remove),而 Employee[] 的大小是固定的。因此,Employee[]除非需要,否则很难使用。

于 2010-03-12T06:21:29.063 回答
16

最大的区别是数组一旦创建就不能再长或短了。但是,列表实例可以添加或删除元素。还有其他差异(例如,可用的不同方法集),但添加/删除是最大的差异。

我喜欢 List,除非有充分的理由使用 Array,因为 List 的灵活性很好,而且相对于代码通常执行的大多数其他事情的成本而言,性能损失非常小。

如果您想深入了解许多有趣的技术细节,请查看StackOverflow 线程,该线程更深入地研究了 List 与 Array 问题。

于 2010-03-12T06:23:01.573 回答
7

使用通用列表,您可以Add/ Removeetc 便宜(至少在远端)。调整数组大小(添加/删除)更昂贵。明显的缺点是列表有备用容量,因此可能会浪费几个字节——不过,在大多数情况下不值得担心(你可以修剪它)。

一般来说,除非你知道你的数据永远不会改变大小,否则更喜欢列表。

API 方面,因为 LINQ 在它们之间几乎没有选择(即额外的方法在List<T>很大程度上被 LINQ 复制,所以数组可以免费获得它们)。

另一个优点是使用列表不需要公开设置器:

private readonly List<Foo> items = new List<Foo>();
public List<Foo> Items { get { return items; } }

消除一系列null错误,并允许您保持对数据的控制(特别是如果您IList<>在更改内容时使用支持检查/验证的不同实现)。

于 2010-03-12T06:22:49.043 回答
2

您需要在创建数组时知道数组的大小,但在创建后无法更改其大小。

因此,它在创建时为数组使用动态内存分配。(这与用于 C++ 数组的静态内存分配不同,后者的大小必须在编译时知道。)

列表可以在创建后动态增长,并且它具有.Add()执行此操作的功能。

- 来自 MSDN

  1. 泛型与数组列表-SO一般比较。
  2. 泛型列表与数组-SO为什么泛型列表比数组慢?

更喜欢哪一个?List<T>.

于 2010-03-12T06:22:35.040 回答
2

如果要在公共接口中公开集合,.NET Framework 指南建议使用 List 而不是 T[]。(其实就是一个BindingList<T>)

在内部,如果您有一个固定的、已知大小的集合,则数组可能更合适。与将元素添加到列表末尾相比,调整数组大小的成本更高。

于 2010-03-12T06:23:21.713 回答
1

如果你知道元素的数量数组是一个不错的选择。如果不使用列表。内部List<T>使用一个 T 数组,所以实际上比你想象的更像。

于 2010-03-12T06:22:12.257 回答
1

使用 List,您无需事先知道数组的大小。您可以根据实现的需要动态添加新员工。

于 2010-03-12T06:22:31.850 回答