我基本上想知道在下面提到的场景中使用通用列表而不是数组的差异或优势
class Employee
{
private string _empName;
public string EmpName
{
get{ return _empName; }
set{ _empName = value; }
}
}
1. Employee[] emp
2. List<Employee> emp
任何人都可以告诉我优点或缺点以及更喜欢哪一个?
答案 0 :(得分:20)
一个很大的区别是List<Employee>
可以扩展(你可以调用Add),或者缩小(你可以调用Remove),而Employee []的大小是固定的。因此,Employee[]
更难以使用,除非需要它。
答案 1 :(得分:13)
最大的区别是,一旦创建了数组,就无法使数组更长或更短。但是,列表实例可以添加或删除元素。还有其他差异(例如,可用的方法集不同)但添加/删除是最大的区别。
我喜欢List,除非有一个非常好的理由使用数组,因为List的灵活性很好,并且相对于代码通常所做的大多数其他事情的成本而言,性能损失非常小。
如果您想深入了解许多有趣的技术细节,请查看this StackOverflow thread,深入研究List vs. Array问题。
答案 2 :(得分:7)
使用通用列表,您可以便宜地Add
/ Remove
等(至少在远端)。调整数组大小(添加/删除)的成本更高。明显的缺点是列表具有备用容量,因此可能浪费几个字节 - 在大多数情况下不值得担心(并且你可以修剪它)。
通常情况下,首选列表除非您知道您的数据永远不会改变大小。
API方面,因为LINQ在它们之间几乎没有选择(即List<T>
上的额外方法在很大程度上被LINQ复制,所以数组可以免费获得它们。)
另一个优点是,使用列表不需要公开setter:
private readonly List<Foo> items = new List<Foo>();
public List<Foo> Items { get { return items; } }
消除了一系列null
错误,并允许您保持对数据的控制(特别是如果您在更改内容时使用支持检查/验证的其他IList<>
实现)。
答案 3 :(得分:2)
您需要知道数组在创建时的大小,但在创建后无法更改其大小。
因此,它在创建时为数组使用动态内存分配。 (这与用于C ++数组的静态内存分配不同,其中大小必须在编译时知道。)
列表可以在创建后动态增长,并且具有.Add()
功能。
哪一个更喜欢? List<T>
。
答案 4 :(得分:2)
如果要在公共接口中公开集合,.NET Framework准则建议使用List而不是T []。 (实际上,BindingList&lt; T&gt;)
在内部,如果您的集合是固定的已知大小,则数组可能更合适。与将元素添加到List的末尾相比,调整数组大小非常昂贵。
答案 5 :(得分:1)
如果你知道数组元素数量是一个不错的选择。如果不使用该列表。内部List<T>
使用T数组,因此实际上比你想象的更像。
答案 6 :(得分:1)
使用List,您不需要事先知道数组的大小。您可以根据实施需要动态添加新员工。