List <Class>()vs List <Class>(0)

sta*_*r92 2 .net c# c#-4.0

执行这两行代码之间有什么区别:

IList<Class> list = new List<Class>();
Run Code Online (Sandbox Code Playgroud)

IList<Class> list = new List<Class>(0);
Run Code Online (Sandbox Code Playgroud)

我被告知,首先,无容量构造函数更有效,因为与具有0容量的构造函数相比,它分配更少的内存.我已经搜索过MSDN,并且在那里写的是列表的默认容量是0但是我没有看到任何逻辑...

任何人都可以证实或否认这一理论吗?

And*_*air 8

http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646的帮助下,你可以很容易地回答这个问题.

public List() {
  _items = _emptyArray;
}
Run Code Online (Sandbox Code Playgroud)

VS

public List(int capacity) {
  if (capacity < 0) ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
  Contract.EndContractBlock();

  if (capacity == 0)
     _items = _emptyArray;
  else
    _items = new T[capacity];
}
Run Code Online (Sandbox Code Playgroud)

正如您自己可以看到的:如果没有提供初始容量(ctor()),则将内部_items数组设置为_emptyArray,这与行为相同ctor(0).这看起来像是所有ctor(0)-calls 的内部优化,以避免(多余的)空数组的分配.

最后,与真实的初始容量相比,上述ctor-calls都没有真正的内存效率.这是数据结构的本质,它相应地动态扩展.因此,每当您事先知道实际容量时,您应该调用ctor(capacity)以避免调整大小(这是在此处实现并在每次写入时调用).

  • 嗯.实际上,你的研究表明,由于跳过参数检查,`new List()`比`new List(0)`略快.如果某人真的非常挑剔,那么可以说`List()`在堆栈上占用更少的空间,所以它"使用更少的内存"......但是我不想与这样的人进一步讨论它坏情绪 (3认同)
  • 在core-clr中也是如此:https://github.com/dotnet/coreclr/blob/775003a4c72f0acc37eab84628fcef541533ba4e/src/mscorlib/src/System/Collections/Generic/List.cs (2认同)