c#中List的内部工作

本文关键字:内部 工作 List | 更新日期: 2023-09-27 18:03:09

谁能解释一下List<T>是如何在c#内部工作的?

 public List<ConvData> pdetails = new List<ConvData>();

如何存储?当我们调用pdetails.Add();

c#中List的内部工作

时会发生什么

List的实现方式与c++的vector相同,这意味着实现分配一个预定义大小的数组,填充该数组,当您想要添加元素且数组已满时,实现分配一个更大的新数组,将所有值复制到新数组中,然后添加新值。这导致添加时的平均性能为0(1),但并非总是如此。

看看微软的参考源代码,看看它是如何工作的。

现在,Add方法看起来像这样:

// Adds the given object to the end of this list. The size of the list is
// increased by one. If required, the capacity of the list is doubled
// before adding the new element.
//
public void Add(T item) {
    if (_size == _items.Length) EnsureCapacity(_size + 1);
    _items[_size++] = item;
    _version++;
}

开头是这样的:

public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>
{
    private const int _defaultCapacity = 4;
    private T[] _items;
    [ContractPublicPropertyName("Count")]
    private int _size;

注意,private T[] _items;是列表在内部存储的方式。

.Add(...):

    public void Add(T item) {
        if (_size == _items.Length) EnsureCapacity(_size + 1);
        _items[_size++] = item;
        _version++;
    }