Wesner's thoughts on Collection
Wesner offers his thoughts on my question, What's the difference between System.Collections.Generic.Collection and System.Collections.Generic.List?
I think there are two possible reasons.
- Collection<T> appears to be a replacement for CollectionBase, which provided virtual methods to detect insertions, deletions and changes.
- The new List class no longer provides any virtual methods as did the original ArrayList for performance reasons..
He also educates us on some of the differences between List<T> and the 2.0 ArrayList.
- List<T> does not use any virtual methods. As a result, a number of methods such as the list indexer methods can now be inlined.
- With the default constructor, List<T> and Whidbey ArrayList do not allocate any memory for its items, so an empty list represents a very compact object--comparable in size to an empty array. (8 bytes for Array, 12 bytes for List, 16 bytes for Whidbey ArrayList) It uses the empty array trick that I wrote about in an earlier post. In contrast, earlier versions of ArrayList would allocate space for 16 items by default.
- The initial buffer size when an item is actually added is 4 items not 16 as before.
- List<T> returns an struct-based enumerator, so that iterating through foreach now involves no memory allocations at all.