实际上我总是使用Generic Collections,而且我经常使用List<>。
有些场景我认为new List<string>()
非常难看,我更喜欢使用string[]
,但我不使用它,因为据我所知,泛型具有更好的性能,因此我使用它们。
string [],int []或任何对应用程序有害的非泛型数组?
我只是想知道阵列和通用集合之间的真正区别是什么。
修改
让我们伪造一个场景
如果我使用string[]
或List<string>
,我必须调用此方法吗?什么更好?
static void PrintValues(IEnumerable<string> values) {
foreach(var value in values) {
Console.WriteLine(value);
}
}
答案 0 :(得分:6)
主要区别在于您可以向List<T>
添加新元素。
内部List<T>
将元素存储在T[]
类型的数组中,它只是在添加新元素时自动分配更大的数组(或在删除元素时缩小数组)。这意味着性能将大致相似。使用List<T>
时有一些小的间接,但JITter可能会内联。
使用List<T>
的主要原因是它为您提供了更多功能 - 您可以添加和删除元素。
编辑在使用PrintValues
的示例中,它并不重要。这取决于数据的来源。如果你只是想用一些固定的参数调用它,你可以使用数组,因为它们更容易创建,例如new [] { "hello", "world" }
。
在大多数真实场景中,您将从某个地方读取数据 - 如果您可以一次获取所有数据,那么您可以使用数组。如果您将逐个阅读它们,那么您将使用List<string>
,以便在阅读时添加元素。
答案 1 :(得分:3)
要回答您编辑的问题,答案是:PrintValues
功能无关紧要。它将简单地迭代。
重要的是调用此函数的代码 - 它是如何产生要打印的值的?如果它们是一个相当静态的值列表,那么使用数组会更有效。如果需要构建或以其他方式操纵集合,那么List<T>
(或Stack<T>
或其他)可能会更好。
如果你正在使用LINQ,你将更有可能使用IEnumerable<T>
并且不关心实际实现该接口的类型。
答案 2 :(得分:2)
List<T>
基本上是数组T[]
的包装器,带有其他方法和IList<T>
的隐式实现。
此外,typeof(T[]).IsAssignableFrom(typeof(IList<T>)) == true
。
在我看来,数组的性能会比列表的性能更好,因为列表的所有内容,它都对数组做了一些事情,而数组只对自己做了一些事情。
答案 3 :(得分:1)
我总是考虑在这两者之间做出选择,我也会给你添加一个新的。
答案 4 :(得分:0)
数组是原始语言结构。这意味着理论上它们更有效率。另一方面,它们将具有更少的功能,允许不需要的操作,没有接口,具有有趣属性的多个实现......
除非您遇到非常严重的性能问题,否则请使用集合,而不是数组。