Щоб відповісти на частину питання "чому", чому ні List<T>
, причини - це стійкість до майбутнього та простота API.
Майбутнє стійкість
List<T>
не розроблено так, щоб було легко розширюється шляхом його підкласифікації; він розроблений так, щоб бути швидким для внутрішніх реалізацій. Ви помітите, що методи на ньому не є віртуальними, тому їх не можна перекрити, і немає жодних гачків для його Add
/ Insert
/ Remove
операцій.
Це означає, що якщо вам потрібно буде в майбутньому змінити поведінку колекції (наприклад, відхилити нульові об'єкти, які люди намагаються додати, або виконати додаткову роботу, коли це відбувається, наприклад, оновлення стану вашого класу), то вам потрібно змінити тип колекції ви повертаєтесь до одного підкласу, який буде порушувати зміну інтерфейсу (звичайно, зміна семантики таких речей, як, наприклад, не дозволяючи null, також може бути зміною інтерфейсу, але таких речей, як оновлення стану вашого внутрішнього класу, не буде).
Отже, повертаючи або клас, який можна легко підкласифікувати, Collection<T>
або інтерфейс, наприклад IList<T>
, ICollection<T>
або IEnumerable<T>
ви можете змінити внутрішню реалізацію на інший тип колекції, щоб задовольнити ваші потреби, не порушуючи код споживачів, оскільки його все одно можна повернути як тип, якого вони очікують.
Простота API
List<T>
містить багато корисних операцій , таких як BinarySearch
, Sort
і так далі. Однак якщо це колекція, яку ви виставляєте, то, ймовірно, ви керуєте семантикою списку, а не споживачами. Тож як ваш клас всередині може потребувати цих операцій, споживачі вашого класу хотіли б (або навіть повинні) їх викликати.
Таким чином, пропонуючи простіший клас колекції або інтерфейс, ви зменшуєте кількість членів, які бачать користувачі вашого API, і полегшуєте їх використання.