执行这两行代码有什么区别吗:
IList<Class> list = new List<Class>();
和
IList<Class> list = new List<Class>(0);
有人告诉我,首先,无容量构造函数更有效,因为与容量为 0 的构造函数相比,它分配的内存更少。我搜索了 MSDN,那里写的是列表的默认容量无论如何都是 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-calls 都不是真正的内存有效。这是数据结构的本质,它会相应地动态扩展。因此,只要您预先知道实际容量,就应该调用 ctor(capacity)
以避免调整大小(已实现 here 并在每次写入时调用)。
关于c# - 列表<类>() 与列表<类>(0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124189/