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

本文关键字:gt Class List lt vs | 更新日期: 2023-09-27 18:03:42

执行这两行代码有什么区别吗?

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

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

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

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

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

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

的帮助下,你可以很容易地回答这个问题
public List() {
  _items = _emptyArray;
}

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(capacity)来避免调整大小(这里实现了调整大小,每次写入时调用)。