2011-06-21 1 views

Odpowiedz

21

Prawdopodobnie dlatego, że nie jest nazwą rodzajową i wdraża ICollection natomiast ReadOnlyCollection<T> jest nazwą rodzajową i wdraża ICollection<T>. Zauważ, że ICollection<T> nie implementuje ICollection. Na tym topic:

ICollection<T> Wygląda ICollection, ale to rzeczywiście bardzo różny abstrakcją. Okazało się, że ICollection nie było zbyt przydatne. W tym samym czasie nie mieliśmy abstrakcji, która reprezentowałaby nieindeksowaną kolekcję do odczytu/zapisu. ICollection<T> jest taką abstrakcją i można powiedzieć, że ICollection nie ma dokładnego odpowiednika w ogólnym świecie; IEnumerable<T> jest najbliższy.

Od tego samego postu:

ReadOnlyCollection<T> jest znacznie lepiej ReadOnlyCollectionBase. Jest w przestrzeni nazw System.Collections.ObjectModel.

Efektywnie, ReadOnlyCollection<T> jest ReadOnlyCollectionBase w przestrzeni generycznej.

Należy również zauważyć, że IList<T> nie wykonuje IList.

Ogólnie rzecz biorąc, klasy pre-generics nie służą jako użyteczne abstrakcje dla klas ogólnych (z wyjątkiem IEnumerable).

+0

Naprawdę, 'IEnumerable' ma ten sam problem co' IList' w zasadzie, ale wdrożenie jednolitej metody Extra (i jedną dodatkową właściwość na wyliczający) nie uznano ciężar w porównaniu z dziesiątkami byłoby potrzebne do ' IList' (które 'List ' i faktycznie 'ReadOnlyCollection ' implementują, niezależnie od ich ogólnych interfejsów zbierania) – Random832

+0

Każdy pomysł dlaczego 'IList ' nie dziedziczy po 'ICollection'? Ponieważ ten ostatni jest w zasadzie '' Count' IEnumerable' Plus, a od '' IList ma już 'metody Count' mając' 'IList dziedziczy' ICollection' nie wymagały żadnego więcej pracy dla realizatorów, ale musiałby pozwolono komuś z 'IList ' wiedzieć, ile elementów można oczekiwać od wyliczenia. – supercat

5

Jeśli spojrzysz na historię architektury .net, znajdziesz generyczne od 2.0, ale ReadOnlyCollectionBase już w wersji 1.1. Powód, dla którego nie wybieramy ReadOnlyCollectionBase jest prosty - nie jest ogólny, a celem ReadOnlyCollection<T> jest bycie generycznym. W związku z tym potrzebuje znacznie innego drzewa dziedziczenia.

Celem wszystkich klas *CollectionBase było dostarczenie podstaw do wdrożenia mocno wpisanych kolekcji w .net 1.1. Wraz z wprowadzeniem generycznych w 2.0, stały się przestarzałe, jednak wciąż są w ramach kompatybilności wstecznej.

1

Dziedziczenie z nietypowej klasy bazowej byłoby nieefektywne. Jeśli typ był oparty na nietypowej podstawie, wszystko byłoby cienką warstwą nad kolekcją podstawową, w której cechy ogólne byłyby po prostu wynikiem rzutowania z podstawowych instancji object instancji kolekcji podstawowej.

Powoduje to niepotrzebne boksowanie/rozpakowywanie typów wartości. Jedną z korzyści stosowania leków generycznych jest unikanie takiego boksowania/rozpakowywania, które może mieć niezamierzony wpływ na wydajność zbiorów.