Чтобы ответить на вопрос «почему» на вопрос, почему не List<T>
, причины являются будущей проверкой и простотой API.
Будущее теплоизолирующие
List<T>
не предназначена, чтобы быть легко расширяемой путем создания подклассов его; он разработан так, чтобы быть быстрым для внутренних реализаций. Вы заметите, что методы на нем не являются виртуальными, поэтому их нельзя переопределить, и в его операциях Add
/Insert
/Remove
нет крючков.
Это означает, что если вам нужно изменить поведение коллекции в будущем (например, чтобы отклонить нулевые объекты, которые люди пытаются добавить, или выполнить дополнительную работу, когда это произойдет, например, обновление состояния вашего класса), тогда вам нужно чтобы изменить тип коллекции, к которой вы вернетесь, вы можете подкласса, который будет нарушать изменение интерфейса (конечно, изменение семантики таких вещей, как недопустимость null, также может быть изменением интерфейса, но такие вещи, как обновление внутреннего состояния класса, не будут быть).
Итак, возвращая либо класс, который может быть легко подклассы, такие как Collection<T>
или интерфейс, такой как IList<T>
, ICollection<T>
или IEnumerable<T>
вы можете изменить свою внутреннюю реализацию быть другой тип коллекции, чтобы удовлетворить ваши потребности, не нарушая код поскольку они все еще могут быть возвращены в качестве типа, который они ожидают.
API Простота
List<T>
содержит много полезных операций, таких как BinarySearch
, Sort
и так далее. Однако, если это коллекция, которую вы раскрываете, то, вероятно, вы контролируете семантику списка, а не потребителей. Таким образом, хотя вашему внутреннему классу могут потребоваться эти операции, очень маловероятно, чтобы потребители вашего класса захотели (или даже должны) называть их.
Таким образом, предлагая более простой класс или интерфейс коллекции, вы уменьшаете количество членов, которые видят пользователи вашего API, и упрощают их использование.
Будет ли IList расширять интерфейс ICollection? – bovium 2008-11-07 10:31:53
Да, IList распространяется ICollection . Я добавлю ссылки для документации. –
2008-11-07 10:32:38
@ Jon: Я знаю, что это старо, но можете ли вы прокомментировать, что говорит Кшиштоф на http://blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspx? В частности его комментарий, `Мы рекомендуем использовать Коллекцию, ReadOnlyCollection или KeyedCollection для выходов и свойств и интерфейсов IEnumerable , ICollection , IList для inputs.` CA1002, кажется, идет вместе с комментариями Кшиштофа. Я не могу себе представить, почему конкретная коллекция была бы рекомендована вместо интерфейса, и почему различие между входами/выходами. –
2010-10-05 15:46:00