我读了这段代码:
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);
...
它不是Interface或Abstract,但它没有函数体(对于该类中的任何方法)。我知道ArrayList
和LinkedList
,但对于List
,我不知道它的实现。
我的问题:
List
的实施在哪里?List
等于ArrayList
或其他什么,为什么.net会允许两个等于函数但名称不同的类?如果List
不等于.NET中的任何其他类,那么为什么要给它这么模糊的名字?List类是ArrayList类的通用等价物。它 通过使用其大小的数组来实现IList通用接口 根据需要动态增加。
所以,我认为这是一个糟糕的名字......
答案 0 :(得分:14)
List<T>
的实现无法在Visual Studio中显示,因为它没有源代码。它只显示了类的轮廓(这就是为什么Visual Studio在点击F12时将 [metadata] 置于'代码文件'之上的原因。)
可以在referencesource.microsoft.com上找到实际来源。
不,他们不一样。如果List等于ArrayList或其他什么,为什么.net将允许两个等于函数但名称不同的类?如果List不等于.NET中的任何其他类,那么为什么要给它这么模糊的名字?
ArrayList
是非通用列表实现,而List<T>
是 generic,因此强类型。
关于模棱两可的名称:我认为微软在命名List
时是正确的。无论如何,ArrayList
是一个可怕的名字。它强调实施过多。你不在乎它后面有一个数组:对你来说它只是一个List
。鉴于该名称可用,这对于名称来说是个不错的选择。
答案 1 :(得分:5)
List的实现在哪里?
你所看到的是VS允许你看到的内容,它实际上不是代码,而是每个方法文档的简短摘要。如果您需要代码,则源为available here
List和ArrayList是否相等?如果List不等于.NET中的任何其他类,那么为什么要给它这么模糊的名字?
List<T>
不等于ArrayList
。 List<T>
是强类型的,而ArrayList
使用object
作为内部集合,因此不是强类型。
在.NET中引入generics时,前者变得活灵活现。
我认为List<T>
没有任何含糊之处。它是一个列表,可以包含任何参数作为内部存储,例如List<int>
,List<string>
或List<Foo>
。