执行这两行代码之间有什么区别:
IList<Class> list = new List<Class>();
和
IList<Class> list = new List<Class>(0);
我已经被告知,首先,无容量构造函数更有效,因为与具有0容量的构造函数相比,它分配更少的内存。我已经搜索过MSDN了,并且在那里写了List的默认容量是0然后我没有看到任何逻辑......
有人可以证实或否认这个理论吗?
答案 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并在每次写入时调用)。