为什么c#List实现在ensure capacity方法中指定了这个确切的值?

时间:2014-03-09 09:15:49

标签: c# list

使用ILspy代码是:

private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
    int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
    if (num > 2146435071)
    {
        num = 2146435071;
    }
    if (num < min)
    {
        num = min;
    }
    this.Capacity = num;
}
}

为什么检查num是否大于2146435071,特别是它不应该只检查下溢&amp; set num = Int.Max或任何大于min的值?

1 个答案:

答案 0 :(得分:5)

这与事实有关,List<T>使用数组作为内部存储,最大数组大小设置为2146435071

阅读有关数组最大大小的What is the maximum length of an array in .NET on 64-bit Windows

您可以轻松创建自己的IList<T>实现,该实现不会将数组用作内部存储,并且将允许超过2146435071个元素。当然,由于int.MaxValue会返回IList<T>.Count,因此您仍被int限制为最大元素数。