2008-11-30 38 views
8

Sau khi chuyển sang .NET 2.0+, có bao giờ một lý do để vẫn sử dụng không gian tên systems.Collections (ngoài việc duy trì mã cũ)? Nên không gian tên generics luôn luôn được sử dụng thay thế?Generics and System.Collections

Trả lời

12

Đối với hầu hết các phần, các bộ sưu tập chung sẽ hoạt động nhanh hơn so với đối tác không chung chung và cung cấp cho bạn lợi ích của việc có bộ sưu tập được đánh máy mạnh. So sánh các bộ sưu tập có sẵn trong System.Collections và System.Collections.Generic, bạn sẽ có được "di cư" sau:

 
    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 là bất biến (không có thành viên thay đổi các nội dung của bộ sưu tập) trong khi ICollection <T> là có thể thay đổi. Điều này làm cho các giao diện tương tự trong tên chỉ trong khi ICollection và IEnumerable <T> khác nhau rất ít.

Từ danh sách này, các lớp không chung chung duy nhất không có đối tác chung là BitArray và CaseInsensitiveComparer.

+0

KeyedCollection là giải pháp thay thế thích hợp cho DictionaryBase, tùy thuộc vào dữ liệu bạn đang lưu trữ. –

0

Trong một số trường hợp, các thùng chứa chung hoạt động tốt hơn các vùng chứa cũ. Họ nên thực hiện ít nhất cũng như những cái cũ trong mọi hoàn cảnh. Và họ giúp đỡ để bắt lỗi lập trình. Đó là một sự kết hợp hiếm hoi của một trừu tượng hữu ích hơn và hiệu suất tốt hơn, vì vậy không có nhiều lý do để tránh chúng. Chỉ khi bạn bị ép buộc bởi một thư viện giả, bạn phải làm việc với thư viện đó được viết trước khi Generics.

0

Tôi đã xem cuộc phỏng vấn với Anders Hejlsberg từ nhóm C# và anh ấy được hỏi liệu có bất kỳ điều gì anh ấy hối hận với các bản phát hành trước đó của .net không. Không có generics trong asp.net 1.0 là điều đầu tiên anh ta đề cập đến. Không có nó ở đó có nghĩa là họ đã phải thực hiện cách giải quyết mà sẽ gắn bó với các thư viện .net và sớm trở thành mã di sản.

Tôi không bao giờ sử dụng không gian tên System.Collections và từ tuyên bố của ông này dường như là con đường chính xác.

0

Về điều xấu duy nhất tôi có thể nghĩ đến khi sử dụng Generics là không đúng, ví dụ: nếu bạn có List<Person> và bạn muốn chuyển nó sang phương thức mất List<object> bạn không thể chuyển thành List<Person>List<object> trực tiếp.

Sự cố này được giải quyết trong .NET 4.0.