c# - 列表<类>() 与列表<类>(0)

标签 c# .net c#-4.0

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

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/

相关文章:

c# - 在c#中调整python的itertools.product内部的for

c# - Html.CheckBoxFor 类型转换错误

Javascript 提示保存到 C# 中的变量,单击相同的按钮

c# - 无法从程序集 "System.Web.HttpContext"加载类型 "System.Web"

c# - 覆盖为嵌套/传递依赖项注入(inject)的组件实现

c# - foreach 循环中的异步调用

c# - 日期时间上下舍入

visual-studio-2010 - 从 Intellisense 隐藏(抽象)类

c# - WebSecurity.CreateUserAndAccount "Field does not exist"

.net - InternalsVisibleTo 属性的问题