List的实现是什么?

What's the implementation of List?

我读了这段代码:

List<long> userIdList = new List<long>();

但是我跳转到List的定义(使用VS2012)(在System.Collections.Generic),我发现:

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
{
    // Summary:
    //     Initializes a new instance of the System.Collections.Generic.List<T> class
    //     that is empty and has the default initial capacity.
    [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    public List();
    //
    // Summary:
    //     Initializes a new instance of the System.Collections.Generic.List<T> class
    //     that contains elements copied from the specified collection and has sufficient
    //     capacity to accommodate the number of elements copied.
    //
    // Parameters:
    //   collection:
    //     The collection whose elements are copied to the new list.
    //
    // Exceptions:
    //   System.ArgumentNullException:
    //     collection is null.
    public List(IEnumerable<T> collection);
    //
    // Summary:
    //     Initializes a new instance of the System.Collections.Generic.List<T> class
    //     that is empty and has the specified initial capacity.
    //
    // Parameters:
    //   capacity:
    //     The number of elements that the new list can initially store.
    //
    // Exceptions:
    //   System.ArgumentOutOfRangeException:
    //     capacity is less than 0.
    [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
    public List(int capacity);

    // Summary:
    //     Gets or sets the total number of elements the internal data structure can
    //     hold without resizing.
    //
    // Returns:
    //     The number of elements that the System.Collections.Generic.List<T> can contain
    //     before resizing is required.
    //
    // Exceptions:
    //   System.ArgumentOutOfRangeException:
    //     System.Collections.Generic.List<T>.Capacity is set to a value that is less
    //     than System.Collections.Generic.List<T>.Count.
    //
    //   System.OutOfMemoryException:
    //     There is not enough memory available on the system.
    public int Capacity { get; set; }
    //
    // Summary:
    //     Gets the number of elements actually contained in the System.Collections.Generic.List<T>.
    //
    // Returns:
    //     The number of elements actually contained in the System.Collections.Generic.List<T>.
    public int Count { get; }

    // Summary:
    //     Gets or sets the element at the specified index.
    //
    // Parameters:
    //   index:
    //     The zero-based index of the element to get or set.
    //
    // Returns:
    //     The element at the specified index.
    //
    // Exceptions:
    //   System.ArgumentOutOfRangeException:
    //     index is less than 0.-or-index is equal to or greater than System.Collections.Generic.List<T>.Count.
    public T this[int index] { get; set; }

    // Summary:
    //     Adds an object to the end of the System.Collections.Generic.List<T>.
    //
    // Parameters:
    //   item:
    //     The object to be added to the end of the System.Collections.Generic.List<T>.
    //     The value can be null for reference types.
    public void Add(T item);

    ...

它不是接口或抽象,但它没有函数体(对于其中的任何方法class)。我知道 ArrayListLinkedList,但是对于 List,我不知道它的实现。

我的问题:

  1. List的实现在哪里?
  2. 如果 List 等于 ArrayList 或其他东西,为什么 .net 允许两个 class 等于函数但名称不同?如果 List 不等于 .NET 中的任何其他 class,那么为什么要给它起这样一个模棱两可的名称?

MSDN states:

The List class is the generic equivalent of the ArrayList class. It implements the IList generic interface by using an array whose size is dynamically increased as required.

所以,我认为这是一个糟糕的名字...

Where is the implementation of List?

你看到的是VS让你看到的,它实际上不是代码,而是每个方法文档的简短摘要。如果你想要代码,来源是 available here

Are List and ArrayList equal? If List doesn't equal any other class in .NET, so why give it such an ambiguous name?

List<T> 不等于 ArrayListList<T> 是强类型的,而 ArrayList 使用 object 作为内部集合,因此不是强类型的。

前者是在 .NET 中引入 generics 时出现的。

我认为 List<T> 没有任何歧义。它是一个列表,可以包含任何参数,因为它是内部存储,例如 List<int>List<string>List<Foo>

无法从 Visual Studio 显示 List<T> 的实现,因为它不存在源代码。它只显示 class 的轮廓(这就是为什么 Visual Studio 在按 F12 时将 [元数据] 放在 'code file' 之上的原因)。 =19=]

可在 referencesource.microsoft.com 上找到实际来源。

If List equals ArrayList or something, why .net will allow two class which equals function but different name? If List doesn't equal any other class in .NET, so why give it such an ambiguous name?

不,它们不一样。 ArrayList 是一个非泛型列表实现,而 List<T> generic,因此是强类型的。

关于歧义的名称:我认为微软List的命名是正确的。 ArrayList 无论如何都是一个糟糕的名字。太强调执行了。你不关心它后面有一个数组:对你来说它只是一个 List。鉴于该名称可用,这是一个不错的名称选择。