【问题标题】:Internal working of List in c# [duplicate]C#中List的内部工作[重复]
【发布时间】:2015-07-16 05:06:55
【问题描述】:

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

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

它是如何存储的?当我们调用pdetails.Add();时究竟会发生什么

【问题讨论】:

标签: c#


【解决方案1】:

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

【讨论】:

  • 所以,在将元素添加到列表之后。列表将包含值或引用的确切内容
  • 取决于对象的类型,是引用类型还是值类型
  • 好的..现在我的概念清晰了。谢谢
【解决方案2】:

看看at the reference source from Microsoft,看看它是如何工作的。

现在,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++;
}

【讨论】:

    【解决方案3】:

    开头是这样的:

    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++;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      相关资源
      最近更新 更多