Spróbujmy myśleć nieszablonowo za pomocą logiki / i zrozumieć dokładnie te trzy interfejsy w pytaniu:
Gdy klasa niektórych instancji implementuje interfejs System.Collection.IEnumerable, to w prostych słowach możemy powiedzieć, że ta instancja jest zarówno policzalna, jak i iterowalna, co oznacza, że ta instancja pozwala w jakiś sposób w jednej pętli przejść / uzyskać / przekazać / przeglądaj / iteruj po / przez wszystkie elementy i elementy, które zawiera ta instancja.
Oznacza to, że można również wyliczyć wszystkie elementy i elementy, które zawiera ta instancja.
Każda klasa implementująca interfejs System.Collection.IEnumerable implementuje również metodę GetEnumerator, która nie przyjmuje argumentów i zwraca instancję System.Collections.IEnumerator.
Instancje interfejsu System.Collections.IEnumerator zachowują się bardzo podobnie do iteratorów C ++.
Kiedy klasa niektórych instancji implementuje interfejs System.Collection.ICollection, to w prostych słowach możemy powiedzieć, że ta instancja jest zbiorem rzeczy.
Ogólna wersja tego interfejsu, tj. System.Collection.Generic.ICollection, jest bardziej informacyjna, ponieważ ten ogólny interfejs wyraźnie określa, jaki jest typ rzeczy w kolekcji.
Wszystko to jest rozsądne, racjonalne, logiczne i ma sens, że interfejs System.Collections.ICollection dziedziczy po interfejsie System.Collections.IEnumerable, ponieważ teoretycznie każda kolekcja jest zarówno wymienna, jak i iterowalna, a teoretycznie możliwe jest przejrzenie wszystkich elementów i elementów w każdej kolekcji.
Interfejs System.Collections.ICollection reprezentuje skończoną kolekcję dynamiczną, którą można zmieniać, co oznacza, że istniejące elementy można usunąć z kolekcji, a nowe elementy można dodać do tej samej kolekcji.
To wyjaśnia, dlaczego interfejs System.Collections.ICollection ma metody „Dodaj” i „Usuń”.
Ponieważ instancje interfejsu System.Collections.ICollection są kolekcjami skończonymi, słowo „skończone” oznacza, że każda kolekcja tego interfejsu ma zawsze skończoną liczbę elementów i elementów.
Właściwość Count interfejsu System.Collections.ICollection zakłada zwrócenie tej liczby.
Interfejs System.Collections.IEnumerable nie ma tych metod i właściwości, jakie ma interfejs System.Collections.ICollection, ponieważ nie ma sensu, aby System.Collections.IEnumerable miał te metody i właściwości, które ma interfejs System.Collections.ICollection.
Logika mówi również, że każda instancja, która jest zarówno policzalna, jak i iterowalna, niekoniecznie jest kolekcją i niekoniecznie jest zmienna.
Kiedy mówię zmienny, mam na myśli to, że nie od razu myślę, że możesz dodać lub usunąć coś z czegoś, co jest zarówno policzalne, jak i iterowalne.
Na przykład, jeśli właśnie utworzyłem skończoną sekwencję liczb pierwszych, ta skończona sekwencja liczb pierwszych jest rzeczywiście instancją interfejsu System.Collections.IEnumerable, ponieważ teraz mogę przejrzeć wszystkie liczby pierwsze w tej skończonej sekwencji w jednej pętli i rób wszystko, co chcę zrobić z każdym z nich, na przykład drukując każdy z nich do okna lub ekranu konsoli, ale ta skończona sekwencja liczb pierwszych nie jest instancją interfejsu System.Collections.ICollection, ponieważ nie ma sensu dodaj liczby złożone do tej skończonej sekwencji liczb pierwszych.
Również chcesz, aby w następnej iteracji uzyskać następną najbliższą większą liczbę pierwszą do bieżącej liczby pierwszej w bieżącej iteracji, jeśli tak, nie chcesz również usuwać istniejących liczb pierwszych z tej skończonej sekwencji liczb pierwszych.
Prawdopodobnie chcesz także użyć, zakodować i napisać „return return” w metodzie GetEnumerator interfejsu System.Collections.IEnumerable w celu wygenerowania liczb pierwszych i nieprzydzielania niczego na stercie pamięci, a następnie zadania Garbage Collector (GC) do obu zwolnij i zwolnij tę pamięć ze sterty, ponieważ jest to oczywiście zarówno marnowanie pamięci systemu operacyjnego, jak i zmniejszenie wydajności.
Dynamiczne przydzielanie i zwalnianie pamięci na stercie powinno odbywać się podczas wywoływania metod i właściwości interfejsu System.Collections.ICollection, ale nie podczas wywoływania metod i właściwości interfejsu System.Collections.IEnumerable (chociaż interfejs System.Collections.IEnumerable ma tylko 1 metoda i 0 właściwości).
Zgodnie z tym, co powiedzieli inni na tej stronie przepełnienia stosu, interfejs System.Collections.IList po prostu reprezentuje porządek kolekcję do co wyjaśnia, dlaczego metody interfejsu System.Collections.IList działają z indeksami w przeciwieństwie do interfejsu System.Collections.ICollection.
W skrócie interfejs System.Collections.ICollection nie oznacza, że jego instancję można zamówić, ale interfejs System.Collections.IList implikuje to.
Zestaw teoretycznie uporządkowany to specjalny przypadek zestawu nieuporządkowanego.
Ma to również sens i wyjaśnia, dlaczego interfejs System.Collections.IList dziedziczy interfejs System.Collections.ICollection.
List
powinno być o wiele lepiej, tak?