列出<t> .Capacity实现

时间:2015-11-13 16:27:35

标签: c# generic-collections

我正在查看List<T>的源代码。它有财产:

public int Capacity {
get {
    Contract.Ensures(Contract.Result<int>() >= 0);
    return _items.Length;
}
set {
    if (value < _size) {
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.value, ExceptionResource.ArgumentOutOfRange_SmallCapacity);
    }
    Contract.EndContractBlock();

    if (value != _items.Length) {
        if (value > 0) {
            T[] newItems = new T[value];
            if (_size > 0) {
                Array.Copy(_items, 0, newItems, 0, _size);
            }
            _items = newItems;
        }
        else {
            _items = _emptyArray;
        }
    }
}

}

检查if (value > 0)有什么意义,好像不是因为检查if (value < _size)而永远无法访问此代码?

1 个答案:

答案 0 :(得分:3)

value_size均为0时,您忘记了这种情况。请参阅else块,引用_emptyArray。这处理如下所示的情况。

var list = new List<string>(16);
Debug.Assert(list.Count == 0);
Debug.Assert(list.Capacity == 16);
list.Capacity = 0;