List <class>()vs List <class>(0)

时间:2016-08-24 13:06:21

标签: c# .net c#-4.0

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

IList<Class> list = new List<Class>();

IList<Class> list = new List<Class>(0);

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

有人可以证实或否认这个理论吗?

1 个答案:

答案 0 :(得分:8)

您可以在http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646

的帮助下轻松回答问题
public List() {
  _items = _emptyArray;
}

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];
}

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

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