【问题标题】:What's the implementation of List?List的实现是什么?
【发布时间】:2015-07-08 07:21:48
【问题描述】:

我读了这段代码:

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

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

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);

    ...

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

我的问题:

  1. List的实现在哪里?
  2. 如果List 等于ArrayList 或其他什么,为什么.net 将允许两个等于函数但名称不同的类?如果List 不等于 .NET 中的任何其他类,那么为什么要给它起这样一个含糊不清的名字呢?

MSDN states:

List 类是 ArrayList 类的通用等价物。它 通过使用大小为的数组实现 IList 泛型接口 根据需要动态增加。

所以,我认为这是一个坏名字......

【问题讨论】:

标签: c# .net generics generic-list


【解决方案1】:

List&lt;T&gt; 的实现无法从 Visual Studio 中显示,因为它没有源代码。它只是显示类的轮廓(这就是为什么 Visual Studio 在按下 F12 时将 [metadata] 放在“代码文件”顶部的原因)。

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

如果 List 等于 ArrayList 什么的,为什么 .net 将允许两个等于函数但名称不同的类?如果 List 不等于 .NET 中的任何其他类,那为什么要给它起这样一个模棱两可的名字呢?

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

关于模棱两可的名称:我认为微软将List命名为正确的。 ArrayList 无论如何都是一个可怕的名字。它过分强调实施。你不在乎它后面有一个数组:对你来说它只是一个List。鉴于名称可用,这是一个不错的名称选择。

【讨论】:

  • ArrayLists 和LinkedLists 不同操作的时间复杂度有很大差异。了解您使用的是哪一个可能很重要。
【解决方案2】:

List的实现在哪里?

您看到的是 VS 允许您看到的,它实际上不是代码,而是每个方法文档的简要摘要。要代码的话,来源是available here

List 和 ArrayList 是否相等?如果 List 不等于 .NET 中的任何其他类,那么为什么要给它起这样一个模棱两可的名字呢?

List&lt;T&gt; 不等于 ArrayListList&lt;T&gt; 是强类型的,而 ArrayList 使用 object 作为其内部集合,因此不是强类型。

在 .NET 中引入 generics 时,前者应运而生。

我认为List&lt;T&gt; 没有任何含糊之处。它是一个列表,可以包含任何参数,因为它是内部存储,例如List&lt;int&gt;List&lt;string&gt;List&lt;Foo&gt;

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多