2008-11-30 39 views
8

遷移到.NET 2.0+之後,有沒有理由繼續使用systems.Collections命名空間(除了維護遺留代碼)呢?泛型名稱空間是否應該始終使用?泛型和System.Collections

回答

12

大多數情況下,泛型集合的執行速度會比非泛型集合的速度快,併爲您提供強類型集合的好處。在比較System.Collections中和System.Collections.Generic可用的集合,你會得到下面的「移民」:

 
    Non-Generic    Generic Equivalent 
    ------------------------------------------------------------ 
    ArrayList     List<T> 
    BitArray     N/A 
    CaseInsensitiveComparer N/A 
    CollectionBase   Collection<T> 
    Comparer     Comparer<T> 
    DictionaryBase   Dictionary<TKey,TValue> 
    Hashtable     Dictionary<TKey,TValue> 
    Queue      Queue<T> 
    ReadOnlyCollectionBase ReadOnlyCollection<T> 
    SortedList    SortedList<TKey,TValue> 
    Stack      Stack<T> 

    DictionaryEntry   KeyValuePair<TKey,TValue> 

    ICollection    N/A (use IEnumerable<T> or anything that extends it) 
    IComparer     IComparer<T> 
    IDictionary    IDictionary<TKey,TValue> 
    IEnumerable    IEnumerable<T> 
    IEnumerator    IEnumerator<T> 
    IEqualityComparer   IEqualityComparer<T> 
    IList      IList<T> 

ICollection的是不變的(沒有成員來更改集合的內容),而ICollection的<牛逼>是可變的。這使得名稱相似的接口僅在ICollection和IEnumerable <T>相差很小。

從這個列表中,唯一沒有泛型類的非泛型類是BitArray和CaseInsensitiveComparer。

+0

KeyedCollection 是DictionaryBase的合適替代品,具體取決於您要存儲的數據。 – 2009-06-09 21:25:00

0

在某些情況下,通用容器的性能比舊的要好。在任何情況下,他們至少應該表現得和舊錶現一樣。他們幫助捕捉編程錯誤。這是一個更有用的抽象和更好的性能的罕見組合,所以沒有太多的理由來避免它們。只有當你被一個蹩腳的圖書館強迫時,你必須使用那些在泛型之前編寫的圖書館。

0

我看到了一個來自C#團隊的Anders Hejlsberg的採訪,他被問到是否有任何他對以前版本的.net感到遺憾。在asp.net 1.0中沒有泛型是他提到的第一件事。沒有它意味着他們不得不實施解決方案,這些解決方案將堅持使用.net庫,並很快成爲遺留代碼。

我從來沒有使用System.Collections命名空間,並從他的聲明這似乎是正確的路徑。

0

關於唯一不好的就是我能想到使用泛型的時候是方差,因此,例如,如果你有一個List<Person>,你想它傳遞給需要List<object>你不能因爲List<Person>不能轉換的方法直接使用List<object>

此問題已在.NET 4.0中解決。