Quelle est la mise en œuvre de la liste?

J’ai lu ce code:

List userIdList = new List(); 

Mais j’ai sauté à la définition (utiliser VS2012) de List (dans System.Collections.Generic ), j’ai trouvé:

 public class List : IList, ICollection, IEnumerable, IList, ICollection, IEnumerable { // Summary: // Initializes a new instance of the System.Collections.Generic.List 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 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 collection); // // Summary: // Initializes a new instance of the System.Collections.Generic.List 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 can contain // before resizing is required. // // Exceptions: // System.ArgumentOutOfRangeException: // System.Collections.Generic.List.Capacity is set to a value that is less // than System.Collections.Generic.List.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. // // Returns: // The number of elements actually contained in the System.Collections.Generic.List. 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.Count. public T this[int index] { get; set; } // Summary: // Adds an object to the end of the System.Collections.Generic.List. // // Parameters: // item: // The object to be added to the end of the System.Collections.Generic.List. // The value can be null for reference types. public void Add(T item); ... 

Ce n’est pas Interface ou Abstract, mais il n’a pas de corps de fonction (pour aucune méthode de cette classe). Je connais ArrayList et LinkedList , mais pour List , je n’ai aucune idée de son implémentation.

Ma question:

  1. Où est la mise en œuvre de la List ?
  2. Si List est égal à ArrayList ou quelque chose du ArrayList , pourquoi .net autorisera-t-il deux classes qui sont équivalentes à la fonction mais au nom différent? Si List ne correspond à aucune autre classe dans .NET, pourquoi lui donner un nom aussi ambigu?

Les états MSDN :

La classe List est l’équivalent générique de la classe ArrayList. Il implémente l’interface générique IList en utilisant un tableau dont la taille est augmentée dynamicment en fonction des besoins.

Donc, je pense que c’est un mauvais nom …

L’implémentation de List ne peut pas être montrée à partir de Visual Studio car le code source n’est pas présent. Il montre simplement le contour de la classe (c’est pourquoi Visual Studio place [métadonnées] au-dessus du ‘fichier de code’ lorsque vous appuyez sur F12).

La source réelle peut être trouvée sur referencesource.microsoft.com .

Si List est égal à ArrayList ou quelque chose du genre, pourquoi .net autorisera-t-il deux classes qui sont équivalentes à la fonction mais au nom différent? Si List ne correspond à aucune autre classe dans .NET, pourquoi lui donner un nom aussi ambigu?

Non, ils ne sont pas les mêmes. ArrayList est une implémentation de liste non générique, alors que List est générique et est donc fortement typé.

En ce qui concerne le nom ambigu: je pense que Microsoft a raison de nommer List . ArrayList était un nom terrible de toute façon. Cela met trop l’accent sur la mise en œuvre. Vous vous en fichez, il y a un tableau derrière cela: pour vous, il ne s’agit que d’une List . Étant donné que le nom était disponible, c’était une bonne option pour un nom.

Où est la mise en œuvre de la liste?

Ce que vous voyez est ce que VS vous permet de voir: ce n’est pas réellement le code mais un bref résumé de la documentation de chaque méthode. Si vous voulez le code, la source est disponible ici

Est-ce que List et ArrayList sont égaux? Si List ne correspond à aucune autre classe dans .NET, pourquoi lui donner un nom aussi ambigu?

List ne correspond pas à ArrayList . Une List est fortement typée, alors ArrayList utilise object comme collection interne, elle n’est donc pas fortement typée.

Le premier est né lorsque les génériques ont été introduits dans .NET.

Je pense que rien n’est ambigu dans List . Il s’agit d’une liste pouvant contenir n’importe quel paramètre de la mémoire interne, par exemple List , List ou List .